2013-01-05 42 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

相关问题