运算符

在 Ruby 中,诸如 + 之类的运算符被定义为类的方法。 字面量 在较低级别的 C 语言中定义它们的方法。 例如, String 类。

Ruby 对象可以定义或重载它们自己的大多数运算符的实现。

这是一个例子

class Foo < String
  def +(str)
    self.concat(str).concat("another string")
  end
end

foobar = Foo.new("test ")
puts foobar + "baz "

这将打印

test baz another string

可用的运算符取决于实现类。

运算符行为

一个类如何对给定的运算符做出反应,取决于该类,因为运算符是方法实现。

当使用运算符时,是操作左侧的表达式指定了行为。

'a' * 3         #=> "aaa"
3 * 'a'         # TypeError: String can't be coerced into Integer

逻辑运算符

逻辑运算符不是方法,因此不能重新定义/重载。 它们在较低级别被标记化。

短路逻辑运算符(&&||andor)并不总是产生布尔值。 与代码块类似,定义操作结果的是最后评估的表达式。

&&, and

&&/and 运算符都提供短路,通过从左到右执行运算符的每一侧,并在第一次出现假值表达式时停止。 定义结果的表达式是最后执行的表达式,无论是最终的表达式,还是第一次出现的假值表达式。

一些例子

true && 9 && "string"                       #=> "string"
(1 + 2) && nil && "string"                  #=> nil
(a = 1) && (b = false) && (c = "string")    #=> false

puts a                                      #=> 1
puts b                                      #=> false
puts c                                      #=> nil

在最后一个例子中,c 被初始化,但没有定义。

||, or

||/or 短路的方式是返回第一个真值表达式的结果。

一些例子

(1 + 2) || true || "string"                 #=> 3
false || nil || "string"                    #=> "string"