在 Ruby 中,为什么 nil[1]=1 评估为 nil? [英] In Ruby, why does nil[1]=1 evaluate to nil?

查看:58
本文介绍了在 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,尽管 foobar 未定义.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆