【问题标题】:How does "||=" work? [duplicate]“||=”是如何工作的? [复制]
【发布时间】:2012-06-22 19:34:31
【问题描述】:

可能重复:
What does ||= (or equals) mean in Ruby?

我正在学习 Ruby,但对以下代码感到困惑。我可以理解它的作用,但不明白它是如何工作的。

h = Hash.new
h['key1'] ||= 'value1'
=> "value1"

p h
=> {"key1"=>"value1"}

【问题讨论】:

标签: ruby


【解决方案1】:

给定一个Hash

hash = {}

这个表达式:

hash[:key] ||= :value

扩展到:

hash[:key] || hash[:key] = :value

Ruby 的逻辑运算符short circuit,这意味着只有当且仅当hash[:key]falsenil 时才会执行hash[:key] = :value

如果是其他任何东西,它的值本身就足以确定logical disjunction的结果,表达式的其余部分不会被计算。

根本上不同于:

hash[:key] = hash[:key] || :value

在这种情况下,[]= 方法将被调用,唯一的区别是它将接收哪个参数::value 如果hash[:key]falsenil,或者值为hash[:key] 本身。

【讨论】:

    【解决方案2】:

    这是一个缩写的赋值伪运算符。其中有十一个;最常见的是:

    x += y #expands to x = x+y
    

    ||= 也是这样:

    x ||= y expands to x = x||y
    

    适用于+、-、、/、%、*、&&、||、&、|、^、>。

    【讨论】:

    • 这是错误。请看What does ||= mean in Ruby?
    • 虽然你的推理正确的,但结论是错误的,正如 Andrew Marshall 所指出的。 x ||= y 实际上扩展为 x || x = y。细微的差别在于如果xfalsenil,则不会发生分配
    • @Andrew 嗯,我写这篇文章时参考了 The Ruby Programming Language (Flanagan and Matsomoto) 的第 96 页。扩展x=x||y 在表格中被提及。在一段文本中注意到,在左值不是 false 或 nil(没有赋值)的情况下,它的行为略有不同。
    • @steenslag 有趣。关于为什么不是另一个问题中提到的那个(带有支持它的代码)以及Ruby Inside 上的一篇好帖子,有很多讨论。最终,它并不完全等同于a || a = ba ||= b
    【解决方案3】:

    Hash.new 中的默认值为nil

    所以h['key1'] ||= 'value1' 用作 "如果key='key1'还没有对应的值,就让值是'value1'"

    【讨论】:

    • 这并不完全正确。 h['key1'] = false; h['key1'] ||= 42; h['key1'] #=> 42.
    • @AndrewMarshall 抱歉,有什么冲突吗?
    • 是的。我为h['key'] 分配了一个值,然后对其执行了||=,但它从||= 获得了值。您的回答指出,这应该只发生在“如果 key1 还没有对应的值”,但我只是展示了一个已经存在值的情况。
    • 这是可能的,但我只是想解释给定代码中发生了什么。
    • 不会改变您的解释不正确的事实。为了进一步混淆你说有一个“默认值”,然后说||= 只有在“没有相应的值”时才会做一些事情。这意味着 ||= 本质上是一个空操作,但事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2014-08-25
    • 2011-10-02
    • 2011-10-22
    • 2011-04-15
    • 2011-04-26
    • 2015-09-24
    • 1970-01-01
    相关资源
    最近更新 更多