Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby “怎么做?”||=&引用;工作_Ruby - Fatal编程技术网

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