Ruby “怎么做?”||=&引用;工作
可能重复:Ruby “怎么做?”||=&引用;工作,ruby,Ruby,可能重复: 我正在学习Ruby,对下面的代码感到困惑。我能理解它的作用,但不能确切地理解它是如何工作的 h = Hash.new h['key1'] ||= 'value1' => "value1" p h => {"key1"=>"value1"} Hash.new中的默认值为nil 因此h['key1']|=“value1”的工作原理如下 “如果key='key1'还没有相应的值,则将该值设为'value1'它是一个缩写的伪赋值运算符。有十一个,;最常见的是: x +
我正在学习Ruby,对下面的代码感到困惑。我能理解它的作用,但不能确切地理解它是如何工作的
h = Hash.new
h['key1'] ||= 'value1'
=> "value1"
p h
=> {"key1"=>"value1"}
Hash.new
中的默认值为nil
因此h['key1']|=“value1”
的工作原理如下
“如果key='key1'还没有相应的值,则将该值设为'value1'它是一个缩写的伪赋值运算符。有十一个,;最常见的是:
x += y #expands to x = x+y
| |=
的方法相同:
x ||= y expands to x = x||y
它适用于+、-、/、%、*、&&、| |&、|&、|、^、.给定的
哈希值:
hash = {}
这句话:
hash[:key] ||= :value
扩展到:
hash[:key] || hash[:key] = :value
Ruby的逻辑运算符,这意味着只有当且仅当hash[:key]
为false
或nil
时,才会执行hash[:key]=:value
如果是其他值,则仅其值就足以确定表达式的结果,表达式的其余部分将不进行计算
这与:
hash[:key] = hash[:key] || :value
在这种情况下,[]=
方法将以任何方式调用,唯一的区别是它将接收哪个参数::value
如果散列[:key]
为false
或nil
,否则为散列[:key]
本身的值。这不完全正确<代码>h['key1']=false;h['key1']| |=42;h['key1']#=>42
@AndrewMarshall抱歉,有什么冲突吗?是的。我给h['key']
分配了一个值,然后对它执行了|124;=
,但它从|124;=
获得了值。您的回答指出,只有在“key1还没有相应的值”的情况下才会发生这种情况,但我只是展示了一个案例,当已经有值时会发生这种情况。这是可能的,但我只是想解释给定代码中发生了什么。这并不能改变您的解释不正确的事实。为了进一步混淆问题,您说有一个“默认值”,然后说| |=
只有在“没有相应的值”的情况下才会执行某些操作。这意味着| |=
本质上是一个no-op,但事实并非如此。请参阅文章以获得详尽的解释。感谢大家的评论。特别是KL-7。这篇文章使我的理解非常清楚。@charles你说的那篇文章清楚地表明你接受的答案是错误的,那么你为什么接受它呢?重复:,,,,,,,,,可能还有许多其他的。另见。说真的,什么时候才能修复坏掉的搜索功能?伙计们,已经四年了!这是错误的。请看,正如安德鲁·马歇尔所指出的,虽然你的推理是正确的,但结论是错误的x | |=y
实际上扩展为x | | x=y
。微妙的区别是,如果x
为false
或nil
@Andrew-Hmm,则不会发生赋值。我在写这篇文章时引用了Ruby编程语言(Flanagan和Matsomoto)的第96页。表中提到了扩展名x=x | | y
。在一个文本块中,需要注意的是,如果左值不为false或nil(无赋值),则其行为略有不同。@steenslag-interest。关于为什么它不是另一个问题中提到的(有代码支持)有很多讨论,还有一篇关于它的好文章。最终,它并不完全等同于a | | a=b
或a | |=b
。