在 Ruby 中,为什么 nil[1]=1 评估为 nil? [英] In Ruby, why does nil[1]=1 evaluate to nil?
本文介绍了在 Ruby 中,为什么 nil[1]=1 评估为 nil?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
例如:
nil[1] #=> NoMethodError
nil[1]=1 #=> nil
这不仅仅是语法,变量也会发生:
It's not just syntax, as it happens with variables too:
a = nil
a[1] #=> NoMethodError
a[1]=1 #=> nil
奇怪:
nil.method(:[]=) #=> NameError
[].method(:[]=) #=> #<Method...>
红宝石 2.3.0p0
Ruby 2.3.0p0
推荐答案
一些随机发现:[仅在 Ruby 2.3.0p0]
该方法似乎不存在:
nil.method(:[]=) #=> NameError: undefined method `[]='
nil.respond_to?(:[]=) #=> false
并且您不能使用 send
调用它:
And you can't invoke it using send
:
nil.send(:[]=) #=> NoMethodError: undefined method `[]='
Ruby 既不计算右侧,也不计算参数,即
Ruby evaluates neither the right hand side, nor the argument, i.e.
nil[foo]=bar
不会引发 NameError
,尽管 foo
和 bar
未定义.
doesn't raise a NameError
, although foo
and bar
are undefined.
这个表达式似乎等价于nil
:
The expression seems to be equivalent to 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
这篇关于在 Ruby 中,为什么 nil[1]=1 评估为 nil?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文