Ruby 運算子

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
~二進位制補碼運算子是一元運算子,具有"翻轉"位效果,即0變成1,1變成0。 (~a ) 將得到 -61,即為 1100 0011,一個有符號二進位制數的補碼形式。
<<二進位制左移運算子。左運算元的值向左移動右運算元指定的位數。 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 邏輯組成

注意:在方法列標識為 的運算子實際上是方法,因此可以被過載。