2

今天我|=第一次看到它,我试图了解它是如何工作的以及它什么时候有用。

一些实验表明:

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

在 Github 的 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是 falsy 或 undefined,表达式就会被计算并且返回值被赋值为一个布尔值。一旦var |= some_truthy_expression被调用,varwill betrue和进一步调用var |= expression_will_not_be_called将不会评估表达式。

  1. 它是这样工作的吗,在哪里可以找到|=Ruby 文档?
  2. 什么时候可以|=派上用场?
4

3 回答 3

5

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

a op= b

或多或少是以下的简写:

a = a op b

当然,这|意味着什么取决于你在做什么|

  • 对于Integer,它是按位或。
  • 对于falsetruenil,它是一个布尔 OR。
  • 对于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]
于 2013-08-06T22:46:46.257 回答
2

foo |= bar扩展为foo = foo | bar,它使用参数调用|对象上的方法。因此,相关文档将是操作员在任何类别中的文档。foobar|foo

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

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

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

如果左操作数是一个没有定义|方法的类(我在这里没有提到的大多数标准类都是这种情况),你会得到一个NoMethodError.

于 2013-08-06T22:46:36.740 回答
1

在Ruby |= assignment operator中找到帮助。

a |= b等价于,因此是联合数组a = a | b的简写。

在示例代码库中使用时:

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']

感谢你的帮助。通过提问可以学到的东西真是令人难以置信:)

于 2013-08-06T22:53:24.600 回答