2013-01-05 71 views
8

有人可以幫我縮短以下方法嗎?我從這開始,我喜歡就好:有條件地包含鍵值對中的一個散列

def self.some_hash 
    { "foo" => "bar" } 
end 

現在我想添加一個可選的密鑰。我能想到的tersest語法是這樣的:

def self.some_hash(some_key=nil) 
    answer = { "foo" => "bar" } 
    answer[some_key] = "yucky, long-winded syntax" if some_key 
    answer 
end 

修改的方法可行,但我不滿意虛擬墨水的浪費。有沒有辦法縮短它?我意識到可以在散列字面上使用三元操作符,但是這會迫使(我認爲)在條件的每個分支上重複一對,這也比原始的略差。

+0

「幫我縮短以下方法」是一種放棄這應該在codereview.stackexchange.com上進行評論並幫助重構和優化。 –

+0

很遺憾看到這個問題關閉,當它確實問到「我如何有條件地在密鑰/值對中包含哈希?」。我使用[Ruby 2.0的double-splat操作符](http://stackoverflow.com/a/37474217/122087)在其他地方寫了一個答案。 –

+0

@PaulAJungwirth,我想它已經關閉了,因爲我只想提高工作代碼。我可能會修改一些垃圾語法,然後說它不起作用,並且一切都會很好。這是關於**運營商的偉大提示!謝謝<---不鼓勵>在評論中的感謝是另一種愚蠢的,規範在這裏,但 - >謝謝! – danh

回答

8
def self.some_hash(some_key = nil) 
    {"foo" => "bar"}.merge(some_key ? {some_key => "yucky, long-winded syntax"} : {}) 
end 

或者,如果修改原始哈希,

def self.some_hash(some_key = nil) 
    {"foo" => "bar"} 
    .tap{|h| h.merge!(some_key => "yucky, long-winded syntax") if some_key} 
end 

或者,也許你能做到這一點的方式接近你的原文:

def self.some_hash(some_key = nil) 
    {"foo" => "bar"} 
    .tap{|h| h[some_key] = "yucky, long-winded syntax" if some_key} 
end 
+1

哦。這真的很好。總之,像凱爾一樣,而且更清晰。也很好,因爲它包括,而不是有條件地刪除。謝謝。 – danh

+0

爲第一個(功能)片段+1,我會盡可能保持「tap」(恕我直言,它促進命令式,不明確的代碼) – tokland

+0

謝謝。也很感謝了解.tap。 Meta問題:感謝編輯我的問題。我需要採取一些措施來接受編輯嗎? – danh

1

我真的不喜歡它,但,這是非常簡潔(和混亂)

def self.some_hash(some_key=nil) 
    Hash[[["foo", "bar"], [some_key, "some value"]].select(&:first)] 
end 

這可能是一個一點更好。

def self.some_hash(some_key=nil) 
    {"foo" => "bar", some_key => "some_value"}.keep_if{ |k, _| k } 
end 

Hash#keep_if

+0

謝謝。爲簡潔起見,它至少是+1。稍等一下,看看還有什麼建議。 – danh

+0

@danh我爲你增加了一個我認爲更好一點的東西。 – Kyle

+0

我希望我能兩次投票。我認爲你的第二個想法更清晰簡潔,但是@sawa讓我們避免了添加+條件刪除。從來沒有聽說過keep_if,也非常感謝你的學習! – danh

相關問題