为什么NilClass#to_hash缺乏?

时间:2011-04-01 15:16:27

标签: ruby null

NilClass上定义的各种方法可以避免Method undefined on NilClass错误,并使您免于使用tryororandand,{{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),那么我们就能做到:

    当某些键可能没有某些值时,多个嵌入式哈希的
  • to_hash
      

    散列[:A] .to_hash [:B] .to_hash [:C]

  •   

我能想到的最佳选择是:

class NilClass; def to_hash; {} end end

但如果我们有hash.fetch(:a, {}).fetch(:b, {})[:c] 那就太好了。为什么会丢失?

3 个答案:

答案 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_ito_fto_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_ato_sto_ito_fto_c都是有原因的吗?   在NilClass上定义但to_hash没有定义?如果没有,我愿意   喜欢请求此功能。

Source