什么时候Ruby中的`| =`有用吗?

时间:2013-08-06 22:36:18

标签: ruby

今天我第一次看到|=,我正在努力了解它的工作原理以及何时有用。

一些实验表明:

var |= nil
# => false
var |= false
# => false
var |= true
# => true
var |= 1
# => true
var |= nil
# => true
var |= false
# => true
var
# => true

Found in Github's html-pipeline gem

  def link_to_mentioned_user(login)
    result[:mentioned_usernames] |= [login]
    url = File.join(base_url, login)
    "<a href='#{url}' class='user-mention'>" +
    "@#{login}" +
    "</a>"
  end

我假设|=的工作方式类似于||=的受保护作业,但会将要分配的布局的返回值转换为布尔值。 这意味着只要var是假的或未定义的,就会对表达式进行求值,并赋予对布尔值的返回值。一旦var |= some_truthy_expression被调用,vartrue,并且对var |= expression_will_not_be_called的进一步调用将不会评估表达式。

  1. 它是否像那样工作,哪里可以在Ruby文档中找到|=
  2. 什么时候可以|=派上用场?

3 个答案:

答案 0 :(得分:5)

对于给定的运算符 op ,类似于:

a op= b

或多或少的简写:

a = a op b

|的含义当然取决于您|的所作内容:

  • 对于Integer,这是一个有点OR。
  • 对于falsetruenil,它是一个布尔值。
  • 对于Array,它是一个集合式联盟。

在你的情况下:

result[:mentioned_usernames] |= [login]

你可能正在使用数组,RHS上的数组就是赠品。结果是,如果result[:mentioned_usernames]已经存在,login将添加|=。还有一个副作用:result[:mentioned_usernames]将删除>> a = [1,2,3,4,4] => [1, 2, 3, 4, 4] >> a |= [1] => [1, 2, 3, 4] 的重复项;例如:

{{1}}

答案 1 :(得分:2)

foo |= bar扩展为foo = foo | bar,它使用参数|调用对象foo上的bar方法。因此,相关文档将是|运算符的文档,无论foo类是什么。

如果|的左操作数是布尔值或nil,它将执行逻辑“或”操作。它将与||具有相同的结果,除了它总是返回一个布尔值。与||的另一个区别是它不会短路。这是一个方法调用,因此在执行方法体之前,将对接收器和参数进行求值。

如果|的左操作数是整数,则右操作数也必须是整数,结果将是按位或两个整数。

如果左操作数是数组或集合,则右操作数也必须是数组或集合,结果将是两个数组或集合的集合并联(类似&将是集合交集)

如果左操作数是一个没有定义|方法的类(对于我在这里没有提到的大多数标准类都是这种情况),你将获得NoMethodError。< / p>

答案 2 :(得分:1)

Ruby |= assignment operator找到帮助。

a |= b相当于a = a | b,因此是union arrays的简写。

在示例代码库中使用时:

results ||= []
results |= ['item'] # shorthand for results = results | ['item']
results #=> ['item']

# Array union excludes duplicates and preserves the order from the original array
results |= ['item']
results #=> ['item']

感谢您的帮助。通过提问可以学到什么是非常不可思议的:)