2011-04-01 83 views
1

NilClass定義的各種方法都得心應手,避免Method undefined on NilClass錯誤,這使您在各種場合使用tryororandand||&&爲什麼NilClass#to_hash缺乏?

  • to_a多個尺寸陣列時,有可能不是一些值對某些指標:

    陣列[I] .to_a [j]的.to_a [k]的

  • to_s的可能失敗的模式匹配:

    串[正則表達式] .to_s * 2

  • to_i,to_f,to_c索引搜索的可能失敗等:

    array.index(element).to_i * 3

但沒有NilClass#to_hash雖然有Hash#to_hash

如果這種方法存在(class NilClass; def to_hash; {} end end),那麼我們就能夠做到:

  • to_hash用於多種嵌入式哈希時,可能沒有一些值對於某些按鍵:

    哈希[ :一個] .to_hash [:b] .to_hash [:C]

我能想到的最好的選擇是:

hash.fetch(:a, {}).fetch(:b, {})[:c] 

但是如果我們有NilClass#to_hash會更好。爲什麼缺少?

+1

爲什麼不見了?因爲沒有人負責添加它。如果這是一項功能要求,這裏並不適合。如果這是關於馬茨頭腦的問題,我想你不會得到明確的答案。你可以自己添加它,如果你喜歡,你的代碼。 *聳聳肩*我沒有投票結束這個問題,因爲也許有人能夠提出一個非常好的論點,爲什麼包括這會讓Ruby變得更糟。然而,我的猜測是,你沒有回答你所問的實際問題。 – Phrogz 2011-04-01 15:52:20

+0

這不是功能請求(尚未)。我想知道,因爲有數組,字符串,但不是哈希看起來不對稱,並且似乎是故意的。 – sawa 2011-04-01 16:32:09

+0

@ Phrogz似乎有一些紅寶石開發者,如果不是因爲Matz,所以我認爲他們可能會有答案。 – sawa 2011-04-01 16:56:38

回答

0

編輯

我發送的請求有關NilClass#to_hash到Ruby開發。馬茨很快就拒絕了。安德魯在下面的評論中通知我,馬茨對此發表了評論。這個問題的答案就這樣給了我的Matz,你可以通過下面的Andrew鏈接看到。

+0

「沒有評論」是什麼意思? Matz在http://redmine.ruby-lang.org/issues/4621#note-3 – 2011-05-01 23:44:37

+0

@Andrew發表了評論感謝您檢查並通知我。我不知何故錯過了評論部分。這是我第一次提交給ruby-lang.org。 – sawa 2011-05-02 00:00:28

+0

正確的主題鏈接:https://www.ruby-forum.com/topic/1587004 – Dorian 2014-10-17 20:22:30

1

這是一個很好的觀點,在Ruby中,您總是可以將這種方法修改爲nil,而Rails中的庫可以完成相當多的monkeypatching操作。就我個人而言,我儘量避免這麼做,因爲改變一個廣泛使用的類的行爲會在其他圖書館中產生無法預料的副作用。如果補丁是由一個流行的框架執行的,那很好,因爲其他庫應該已經過測試,但是完全可以這樣做。

我在想現在會存在一個NilClass#to_hash,如果這樣會解決很多人都感覺到的痛苦點。 try語法不再是了,不太可怕。

hash.try(:[],a).try(:[],b).try(:[],c) 
+2

請注意'Object#try'不是標準Ruby的一部分,而是由ActiveSupport for Rails添加的monkeypatch。 – Phrogz 2011-04-01 16:04:22

+0

我的疑惑是,我確實認爲人們實際上正在解決一個問題(我看到許多與它有關的問題),並且仍然沒有這樣的方法。我分享你的想法。除了'try'是一個rails方法這個事實之外,我不喜歡這樣一個事實,即你必須把這個方法變成一個符號,並把它作爲'try'的第一個參數。 – sawa 2011-04-01 16:36:29

+1

是的,'Object#try'是ActiveSupport的一部分,但這並不意味着它只適用於Rails。您可以在任何項目中使用ActiveSupport。請參閱http://rubygems.org/gems/activesupport。 – 2011-04-01 16:50:20

0

我也會對NilClass#to_hash方法感興趣。

下面是答案通過麥茨:

to_a等是明確的轉換方法,而to_int,to_hash, 等都是隱式轉換方法。我沒有看到任何好的理由,以 添加隱式轉換方法爲零。

這裏是由剛澤田的問題:

NilClass定義的各種方法是方便的,以避免方法 未定義上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用於多種嵌入式哈希時,可能沒有一些值對於某些按鍵:

哈希[:一] .to_hash [:b] .to_hash [:C]

有爲什麼to_ato_sto_ito_fto_c都 上NilClass爲定義,但沒有任何理由?如果沒有,我會 喜歡請求這個功能。

Source