2014-03-05 74 views
2

自我描述性的非工作代碼的元素創建元素:紅寶石哈希利用它被散列中創建

mr_hash = {alpha: "hello", bravo: self.alpha + " world"} # Not working... 

應該給

{alpha: "hello", bravo: "hello world"} 

是否有可能,如果又如何,在哈希內做到這一點?如果沒有使用像中間變量:

charlie = "hello" 
delta = charlie + " world" 
mr_hash = {alpha: charlie, bravo: delta} 
+0

爲什麼你不想使用一個變量? – toro2k

+0

我希望能讓它更優雅......如果你有一長串哈希值,最好不要在定義一箇中間變量和使用它的唯一哈希之間交替選擇 – xxjjnn

+1

布料,在未來考慮暫時擱置一段時間選擇一個答案。急於判斷會阻礙額外的答案,並且(imo)對那些仍在工作的人不尊重。 –

回答

4

也許你正在尋找沒有什麼,但你可以使用Object#tap,以避免產生額外的變量:

mr_hash = Hash.new.tap do |h| 
    h['alpha'] = 'Hello' 
    h['bravo'] = h['alpha'] + ' world' 
end 
mr_hash # => {"alpha"=>"Hello", "bravo"=>"Hello world"} 
3

沒有,這是不可能的,因爲這行代碼,以便創建哈希必須首先解釋。

+0

這是 - 可以 - 唯一正確的答案,因爲給出的理由。 +1 –

4

我看到@maerics(+1)與tap打我太吧。這是現在只是一個輕微的變形(我最初包括一個merge,這是我在@丹尼爾的評論光取出):

mr_hash = {alpha: "hello"}.tap {|h| h[bravo] = h[:alpha] + " world"} 

它仍然沒有做什麼@ClothSword所期待的,但作爲@Agis注意,失望是不可避免的。

+3

雖然沒有必要進行合併嗎? 'mr_hash = {alpha:「hello」}。tap {| h | h [:bravo] = h [:alpha +「world」}'是等價的。 –

+0

這麼好!謝謝,@丹尼爾。我會編輯。 –

+1

我很樂意爲downvote做一個解釋,但我已經足夠長時間知道我可能不會得到它。 –