# Ruby 運算符
Ruby 支持一套豐富的運算符。大多數運算符實際上是方法調用。例如,a + b 被解釋為 a.+(b),其中指向變量 a 的 + 方法被調用,b 作為方法調用的參數。
對于每個運算符(+ - * / % ** & | ^ << >> && ||),都有一個相對應的縮寫賦值運算符(+= -= 等等)。
## Ruby 算術運算符
假設變量 a 的值為 10,變量 b 的值為 20,那么:
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| + | 加法 - 把運算符兩邊的操作數相加 | a + b 將得到 30 |
| - | 減法 - 把左操作數減去右操作數 | a - b 將得到 -10 |
| * | 乘法 - 把運算符兩邊的操作數相乘 | a * b 將得到 200 |
| / | 除法 - 把左操作數除以右操作數 | b / a 將得到 2 |
| % | 求模 - 把左操作數除以右操作數,返回余數 | b % a 將得到 0 |
| ** | 指數 - 執行指數計算 | a**b 將得到 10 的 20 次方 |
## Ruby 比較運算符
假設變量 a 的值為 10,變量 b 的值為 20,那么:
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| == | 檢查兩個操作數的值是否相等,如果相等則條件為真。 | (a == b) 不為真。 |
| != | 檢查兩個操作數的值是否相等,如果不相等則條件為真。 | (a != b) 為真。 |
| > | 檢查左操作數的值是否大于右操作數的值,如果是則條件為真。 | (a > b) 不為真。 |
| < | 檢查左操作數的值是否小于右操作數的值,如果是則條件為真。 | (a < b) 為真。 |
| >= | 檢查左操作數的值是否大于或等于右操作數的值,如果是則條件為真。 | (a >= b) 不為真。 |
| <= | 檢查左操作數的值是否小于或等于右操作數的值,如果是則條件為真。 | (a <= b) 為真。 |
| <=> | 聯合比較運算符。如果第一個操作數等于第二個操作數則返回 0,如果第一個操作數大于第二個操作數則返回 1,如果第一個操作數小于第二個操作數則返回 -1。 | (a <=> b) 返回 -1。 |
| === | 用于測試 _case_ 語句的 when 子句內的相等。 | (1...10) === 5 返回 true。 |
| **.eql?** | 如果接收器和參數具有相同的類型和相等的值,則返回 true。 | 1 == 1.0 返回 true,但是 1**.eql?**(1.0) 返回 false。 |
| **equal?** | 如果接收器和參數具有相同的對象 id,則返回 true。 | 如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a**.equal?**bObj 返回 false,但是 a**.equal?**aObj 返回 true。 |
## Ruby 賦值運算符
假設變量 a 的值為 10,變量 b 的值為 20,那么:
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| = | 簡單的賦值運算符,把右操作數的值賦給左操作數 | c = a + b 將把 a + b 的值賦給 c |
| += | 加且賦值運算符,把右操作數加上左操作數的結果賦值給左操作數 | c += a 相當于 c = c + a |
| -= | 減且賦值運算符,把左操作數減去右操作數的結果賦值給左操作數 | c -= a 相當于 c = c - a |
| *= | 乘且賦值運算符,把右操作數乘以左操作數的結果賦值給左操作數 | c *= a 相當于 c = c * a |
| /= | 除且賦值運算符,把左操作數除以右操作數的結果賦值給左操作數 | c /= a 相當于 c = c / a |
| %= | 求模且賦值運算符,求兩個操作數的模賦值給左操作數 | c %= a 相當于 c = c % a |
| **= | 指數且賦值運算符,執行指數計算,并賦值給左操作數 | c \*\*= a 相當于 c = c \*\* a |
## Ruby 并行賦值
Ruby 也支持變量的并行賦值。這使得多個變量可以通過一行的 Ruby 代碼進行初始化。例如:
```
a = 10
b = 20
c = 30
```
使用并行賦值可以更快地聲明:
```
a, b, c = 10, 20, 30
```
并行賦值在交換兩個變量的值時也很有用:
```
a, b = b, c
```
## Ruby 位運算符
位運算符作用于位,并逐位執行操作。
假設如果 a = 60,且 b = 13,現在以二進制格式,它們如下所示:
```
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a? = 1100 0011
```
下表列出了 Ruby 支持的位運算符。
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| & | 如果同時存在于兩個操作數中,二進制 AND 運算符復制一位到結果中。 | (a & b) 將得到 12,即為 0000 1100 |
| | | 如果存在于任一操作數中,二進制 OR 運算符復制一位到結果中。 | (a | b) 將得到 61,即為 0011 1101 |
| ^ | 如果存在于其中一個操作數中但不同時存在于兩個操作數中,二進制異或運算符復制一位到結果中。 | (a ^ b) 將得到 49,即為 0011 0001 |
| ~ | 二進制補碼運算符是一元運算符,具有"翻轉"位效果。 | (~a ) 將得到 -61,即為 1100 0011,2 的補碼形式,帶符號的二進制數。 |
| << | 二進制左移運算符。左操作數的值向左移動右操作數指定的位數。 | a << 2 將得到 240,即為 1111 0000 |
| >> | 二進制右移運算符。左操作數的值向右移動右操作數指定的位數。 | a >> 2 將得到 15,即為 0000 1111 |
## Ruby 邏輯運算符
下表列出了 Ruby 支持的邏輯運算符。
假設變量 a 的值為 10,變量 b 的值為 20,那么:
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| and | 稱為邏輯與運算符。如果兩個操作數都為真,則條件為真。 | (a and b) 為真。 |
| or | 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。 | (a or b) 為真。 |
| && | 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。 | (a && b) 為真。 |
| || | 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。 | (a || b) 為真。 |
| ! | 稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。 | !(a && b) 為假。 |
| not | 稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。 | not(a && b) 為假。 |
## Ruby 三元運算符
有一個以上的操作稱為三元運算符。第一個計算表達式的真假值,然后根據這個結果決定執行后邊兩個語句中的一個。條件運算符的語法如下:
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| ? : | 條件表達式 | 如果條件為真 ? 則值為 X : 否則值為 Y |
## Ruby 范圍運算符
在 Ruby 中,序列范圍用于創建一系列連續的值 - 包含起始值、結束值(視情況而定)和它們之間的值。
在 Ruby 中,這些序列是使用 ".." 和 "..." 范圍運算符來創建的。兩點形式創建的范圍包含起始值和結束值,三點形式創建的范圍只包含起始值不包含結束值。
| 運算符 | 描述 | 實例 |
| --- | --- | --- |
| .. | 創建一個從開始點到結束點的范圍(包含結束點) | 1..10 創建從 1 到 10 的范圍 |
| ... | 創建一個從開始點到結束點的范圍(不包含結束點) | 1...10 創建從 1 到 9 的范圍 |
## Ruby defined? 運算符
defined? 是一個特殊的運算符,以方法調用的形式來判斷傳遞的表達式是否已定義。它返回表達式的描述字符串,如果表達式未定義則返回 _nil_。
下面是 defined? 運算符的各種用法:
## 用法 1
```
defined? variable # 如果 variable 已經初始化,則為 True
```
例如:
```
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil(未定義)
```
## 用法 2
```
defined? method_call # 如果方法已經定義,則為 True
```
例如:
```
defined? puts # => "method"
defined? puts(bar) # => nil(在這里 bar 未定義)
defined? unpack # => nil(在這里未定義)
```
## 用法 3
```
# 如果存在可被 super 用戶調用的方法,則為 True
defined? super
```
例如:
```
defined? super # => "super"(如果可被調用)
defined? super # => nil(如果不可被調用)
```
## 用法 4
```
defined? yield # 如果已傳遞代碼塊,則為 True
```
例如:
```
defined? yield # => "yield"(如果已傳遞塊)
defined? yield # => nil(如果未傳遞塊)
```
## Ruby 點運算符 "." 和雙冒號運算符 "::"
您可以通過在方法名稱前加上模塊名稱和一條下劃線來調用模塊方法。您可以使用模塊名稱和兩個冒號來引用一個常量。
**::** 是一元運算符,允許在類或模塊內定義常量、實例方法和類方法,可以從類或模塊外的任何地方進行訪問。
**請記住:**在 Ruby 中,類和方法也可以被當作常量。
您只需要在表達式的常量名前加上 **::** 前綴,即可返回適當的類或模塊對象。
如果未使用前綴表達式,則默認使用主 Object 類。
下面是兩個實例:
```
MR_COUNT = 0 # 定義在主 Object 類上的常量
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # 設置全局計數為 1
MR_COUNT = 2 # 設置局部計數為 2
end
puts MR_COUNT # 這是全局常量
puts Foo::MR_COUNT # 這是 "Foo" 的局部常量
```
第二個實例:
```
CONST = ' out there'
class Inside_one
CONST = proc {' in there'}
def where_is_my_CONST
::CONST + ' inside one'
end
end
class Inside_two
CONST = ' inside two'
def where_is_my_CONST
CONST
end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST
```
## Ruby 運算符的優先級
下表按照運算符的優先級從高到低列出了所有的運算符。
| 方法 | 運算符 | 描述 |
| --- | --- | --- |
| 是 | :: | 常量解析運算符 |
| 是 | [ ] [ ]= | 元素引用、元素集合 |
| 是 | \*\* | 指數 |
| 是 | ! ~ + - | 非、補、一元加、一元減(最后兩個的方法名為 +@ 和 -@) |
| 是 | * / % | 乘法、除法、求模 |
| 是 | + - | 加法和減法 |
| 是 | >> << | 位右移、位左移 |
| 是 | & | 位與 |
| 是 | ^ | | 位異或、位或 |
| 是 | <= < > >= | 比較運算符 |
| 是 | <=> == === != =~ !~ | 相等和模式匹配運算符(!= 和 !~ 不能被定義為方法) |
| | && | 邏輯與 |
| | || | 邏輯或 |
| | .. ... | 范圍(包含、不包含) |
| | ??: | 三元 if-then-else |
| | = %= { /= -= += |= &= >>= <<= \*= &&= ||= \*\*= | 賦值 |
| | defined? | 檢查指定符號是否已定義 |
| | not | 邏輯否定 |
| | or and | 邏輯組成 |
**注意:**在方法列標識為 _是_ 的運算符實際上是方法,因此可以被重載。
- Ruby 基礎
- Ruby 簡介
- Ruby 環境
- Ruby 安裝 - Unix
- Ruby 安裝 - Windows
- Ruby 命令行選項
- Ruby 環境變量
- Ruby 語法
- Ruby 數據類型
- Ruby 類和對象
- Ruby 類案例
- Ruby 變量
- Ruby 運算符
- Ruby 注釋
- Ruby 判斷
- Ruby 循環
- Ruby 方法
- Ruby 塊
- Ruby 模塊(Module)
- Ruby 字符串(String)
- Ruby 數組(Array)
- Ruby 哈希(Hash)
- Ruby 日期 & 時間(Date & Time)
- Ruby 范圍(Range)
- Ruby 迭代器
- Ruby 文件的輸入與輸出
- Ruby File 類和方法
- Ruby Dir 類和方法
- Ruby 異常
- Ruby 高級
- Ruby 面向對象
- Ruby 正則表達式
- Ruby 數據庫訪問 - DBI 教程
- Ruby CGI 編程
- Ruby CGI方法
- Ruby CGI Cookies
- Ruby CGI Sessions
- Ruby 發送郵件 - SMATP
- Ruby Socket 編程
- Ruby XML, XSLT 和 XPath 教程
- Ruby Web Services 應用 - SOAP4R
- Ruby 多線程
- 免責聲明