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? 如果接收者和引數具有相同的型別和相等的值,則為真。 1 == 1.0 返回 true,但 1.eql?(1.0) 為 false。
equal? 如果接收者和引數具有相同的物件 ID,則為真。 如果 aObj 是 bObj 的副本,則 aObj == bObj 為真,a.equal?bObj 為假,但 a.equal?aObj 為真。

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
^ 二進位制 XOR 運算子如果位在一個運算元中設定,但在另一個運算元中未設定,則將其複製。 (a ^ b) 將得到 49,即 0011 0001
~ 二進位制一補碼運算子是一元的,其作用是“翻轉”位。 (~a ) 將得到 -61,由於帶符號二進位制數,因此以 2 的補碼形式表示為 1100 0011。
<< 二進位制左移運算子。左運算元的值向左移動由右運算元指定的位數。 a << 2 將得到 240,即 1111 0000
>> 二進位制右移運算子。左運算元的值向右移動由右運算元指定的位數。 a >> 2 將得到 15,即 0000 1111

Ruby 邏輯運算子

Ruby 語言支援以下邏輯運算子

假設變數 a 為 10,變數 b 為 20,則 −

運算子 描述 示例
and 稱為邏輯 AND 運算子。如果兩個運算元都為真,則條件為真。 (a and b) 為真。
or 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 (a or b) 為真。
&& 稱為邏輯 AND 運算子。如果兩個運算元都非零,則條件為真。 (a && b) 為真。
|| 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 (a || b) 為真。
! 稱為邏輯 NOT 運算子。用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其為假。 !(a && b) 為假。
not 稱為邏輯 NOT 運算子。用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其為假。 not(a && b) 為假。

Ruby 三元運算子

還有一個稱為三元運算子的運算子。它首先評估表示式的真假值,然後根據評估結果執行兩個給定語句中的一個。條件運算子具有以下語法 −

運算子 描述 示例
? : 條件表示式 如果條件為真 ? 則為值 X : 否則為值 Y

Ruby 範圍運算子

Ruby 中的序列範圍用於建立一系列連續的值 - 由起始值、結束值和介於兩者之間的值範圍組成。

在 Ruby 中,這些序列是使用 ".." 和 "..." 範圍運算子建立的。兩點形式建立包含範圍,而三點形式建立排除指定高值的範圍。

運算子 描述 示例
.. 建立從起點到終點(包括終點)的範圍。 1..10 建立從 1 到 10(包括 10)的範圍。
... 建立從起點到終點(不包括終點)的範圍。 1...10 建立從 1 到 9 的範圍。

Ruby defined? 運算子

defined? 是一個特殊的運算子,它採用方法呼叫的形式來確定傳遞的表示式是否已定義。它返回表示式的描述字串,如果表示式未定義則返回 nil

defined? 運算子有多種用法

用法 1

defined? variable # True if variable is initialized

例如

foo = 42
defined? foo    # => "local-variable"
defined? $_     # => "global-variable"
defined? bar    # => nil (undefined)

用法 2

defined? method_call # True if a method is defined

例如

defined? puts        # => "method"
defined? puts(bar)   # => nil (bar is not defined here)
defined? unpack      # => nil (not defined here)

用法 3

# True if a method exists that can be called with super user
defined? super

例如

defined? super     # => "super" (if it can be called)
defined? super     # => nil (if it cannot be)

用法 4

defined? yield   # True if a code block has been passed

例如

defined? yield    # => "yield" (if there is a block passed)
defined? yield    # => nil (if there is no block)

Ruby 點 "." 和雙冒號 "::" 運算子

透過在模組方法名稱前加上模組名稱和句點來呼叫模組方法,並使用模組名稱和兩個冒號來引用常量。

:: 是一元運算子,它允許:在類或模組內定義的常量、例項方法和類方法從類或模組外部的任何位置訪問。

請記住 在 Ruby 中,類和方法也可以被視為常量。

您只需要將 :: Const_name 與返回相應類或模組物件的表示式一起使用即可。

如果沒有使用字首表示式,則預設使用主 Object 類。

以下兩個示例 −

MR_COUNT = 0         # constant defined on main Object class
module Foo
   MR_COUNT = 0
   ::MR_COUNT = 1    # set global count to 1
   MR_COUNT = 2      # set local count to 2
end
puts MR_COUNT        # this is the global constant
puts Foo::MR_COUNT   # this is the local "Foo" constant

第二個示例

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 邏輯組合

注意 − 方法列中為“是”的運算子實際上是方法,因此可以被重寫。

廣告

© . All rights reserved.