今天我第一次看到|=
,我正在努力了解它的工作原理以及何时有用。
一些实验表明:
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
被调用,var
将true
,并且对var |= expression_will_not_be_called
的进一步调用将不会评估表达式。
|=
?|=
派上用场?答案 0 :(得分:5)
对于给定的运算符 op ,类似于:
a op= b
或多或少的简写:
a = a op b
|
的含义当然取决于您|
的所作内容:
在你的情况下:
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']
感谢您的帮助。通过提问可以学到什么是非常不可思议的:)