NilClass
上定义的各种方法可以避免Method undefined on NilClass
错误,并使您免于使用try
,oror
,andand
,{{1} },||
在各种场合:
to_a :
阵列[I] .to_a [j]的.to_a [K]
to_s 模式匹配可能会失败:
的字符串[正则表达式] .to_s * 2
to_i,to_f,to_c 可能会失败的索引搜索等:
array.index(元件).to_i * 3
但是没有&&
,但有NilClass#to_hash
。
如果存在这种方法(Hash#to_hash
),那么我们就能做到:
散列[:A] .to_hash [:B] .to_hash [:C]
我能想到的最佳选择是:
class NilClass; def to_hash; {} end end
但如果我们有hash.fetch(:a, {}).fetch(:b, {})[:c]
那就太好了。为什么会丢失?
答案 0 :(得分:1)
这是一个很好的观点,在Ruby中,你总是可以将这样的方法monkeypatch为nil,并且Rails中的库做了很多这样的monkeypatching。就个人而言,我试图避免做很多事情,因为改变广泛使用的类的行为可能会在其他库中产生无法预料的副作用。如果补丁是由一个流行的框架执行的,那很好,因为其他库应该已经用它进行了测试,但是这样做是不可能的,完全是另一回事。
我认为现在会存在NilClass#to_hash
,如果这样可以解决许多人感受到的痛点。 <{1}}语法不再是,而且不是太可怕了。
try
答案 1 :(得分:0)
<强>被修改强>
我向ruby开发发送了关于NilClass#to_hash
的请求。马茨不久就拒绝了。安德鲁在下面的评论中通知我,Matz对此发表了评论。因此,问题的答案是我的Matz,你可以通过下面的安德鲁链接看到。
答案 2 :(得分:0)
我也对NilClass#to_hash
方法感兴趣。
以下是Matz的答案:
to_a等是显式转换方法,而to_int,to_hash, 等等是隐式转换方法。我没有看到任何合理的理由 将隐式转换方法添加到nil。
这是Tsuyoshi Sawada提出的问题:
NilClass
上定义的各种方法可以方便地避免使用Method NilClass错误未定义。例如,
to_a
用于多维数组,当某些索引可能没有某些值时:阵列[I] .to_a [j]的.to_a [K]
to_s
用于可能失败的模式匹配:的字符串[正则表达式] .to_s * 2
to_i
,to_f
,to_c
用于可能失败的索引搜索等:array.index(元件).to_i * 3
但即使有,也没有
NilClass#to_hash
Hash#to_hash
。如果存在这样的方法(相当于class NilClass; def to_hash; {} end end
),那么我们就能做到:
to_hash
用于多个嵌入式哈希,当某些键可能没有某些值时:散列[:A] .to_hash [:B] .to_hash [:C]
to_a
,to_s
,to_i
,to_f
,to_c
都是有原因的吗? 在NilClass
上定义但to_hash
没有定义?如果没有,我愿意 喜欢请求此功能。