【问题标题】:In Ruby, why does nil[1]=1 evaluate to nil?在 Ruby 中,为什么 nil[1]=1 的计算结果为 nil?
【发布时间】:2016-04-24 21:36:23
【问题描述】:

例如:

nil[1]     #=> NoMethodError
nil[1]=1   #=> nil

这不仅仅是语法,变量也一样:

a = nil
a[1]       #=> NoMethodError
a[1]=1     #=> nil

奇怪的是:

nil.method(:[]=)   #=> NameError
[].method(:[]=)    #=> #<Method...>

Ruby 2.3.0p0

【问题讨论】:

  • 无法在 Ruby 2.2.4 上重现。可能是您的版本中的新功能或错误?
  • 奇怪...也许这是一个错误。
  • 我只能在 Ruby 2.3.0 中重现这一点,我认为这是一个错误。可能值得检查bug tracker for this issue
  • 可能已经修复了。无法在 ruby​​ 2.3.0p71(2016-03-30 修订版 54426)上复制。
  • 我相信修复已报告here(“意外的安全呼叫”)。 larsch,你是怎么偶然发现的?各位,举起你的眼镜!一个可疑的错误实际上是一个错误并不是每天都有。

标签: ruby null ruby-2.3


【解决方案1】:

一些随机发现:[仅在 Ruby 2.3.0p0 中]

该方法似乎不存在:

nil.method(:[]=)      #=> NameError: undefined method `[]='
nil.respond_to?(:[]=) #=> false

你不能使用send调用它:

nil.send(:[]=)        #=> NoMethodError: undefined method `[]='

Ruby 既不计算右侧,也不计算参数,即

nil[foo]=bar

不会引发NameError,尽管foobar 未定义。

表达式好像等价于nil:

$ ruby --dump=insns -e 'nil[foo]=bar'
== disasm: #<ISeq:<main>@-e>============================================
0000 trace            1                                               (   1)
0002 putnil
0003 leave

$ ruby --dump=insns -e 'nil'
== disasm: #<ISeq:<main>@-e>============================================
0000 trace            1                                               (   1)
0002 putnil
0003 leave

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多