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。
平等的? 如果接收者和参数具有相同的对象 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
+= 添加 AND 赋值运算符,将右操作数添加到左操作数,并将结果赋给左操作数。 c += a 等价于 c = c + a
-= 减法AND赋值运算符,将左操作数减去右操作数,并将结果赋给左操作数。 c -= a 相当于 c = c - a
*= 乘法与赋值运算符,将右操作数与左操作数相乘,并将结果赋给左操作数。 c *= a 等价于 c = c * a
/= 除法与赋值运算符,将左操作数与右操作数相除,并将结果赋给左操作数。 c /= a 等价于 c = c / a
%= 模数与赋值运算符,使用两个操作数取模并将结果分配给左操作数。 c %= a 相当于 c = c % a
**= 指数AND赋值运算符,对运算符执行指数(幂)计算并将值赋给左操作数。 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
| 如果任一操作数中存在该位,则二元或运算符会复制该位。 (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,则 -

操作员 描述 例子
称为逻辑与运算符。如果两个操作数都为 true,则条件为 true。 (a 和 b) 为真。
或者 称为逻辑或运算符。如果两个操作数中的任何一个不为零,则条件为真。 (a 或 b) 为真。
&& 称为逻辑与运算符。如果两个操作数均非零,则条件为真。 (a && b) 为真。
|| 称为逻辑或运算符。如果两个操作数中的任何一个不为零,则条件为真。 (a || b) 为真。
称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为 true,则逻辑 NOT 运算符将使 false。 !(a && b) 为假。
不是 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为 true,则逻辑 NOT 运算符将使 false。 not(a && b) 为假。

Ruby 三元运算符

还有一种运算符称为三元运算符。它首先评估表达式的真值或假值,然后根据评估结果执行两个给定语句之一。条件运算符具有以下语法 -

操作员 描述 例子
?: 条件表达式 如果条件为真?然后值 X :否则值 Y

Ruby 范围运算符

Ruby 中的序列范围用于创建一系列连续值 - 由起始值、结束值和其间的一系列值组成。

在 Ruby 中,这些序列是使用“..”和“...”范围运算符创建的。两点形式创建一个包含范围,而三点形式创建一个不包括指定高值的范围。

操作员 描述 例子
.. 创建从起点到终点(含)的范围。 1..10 创建从 1 到 10(含)的范围。
... 创建从起点到终点的范围(不包括)。 1...10 创建 1 到 9 的范围。

Ruby定义?运营商

定义?是一个特殊的运算符,它采用方法调用的形式来确定是否定义了传递的表达式。它返回表达式的描述字符串,如果未定义表达式,则返回nil 。

定义有多种用法?操作员

用法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
  = %= { /= -= += |= &= >>= <<= *= &&= ||= **= 任务
  定义? 检查指定符号是否已定义
  不是 逻辑否定
  或和 逻辑构成

注意- 方法列中带有“是”的运算符实际上是方法,因此可能会被覆盖。