2013-01-05 19 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の二重スプラット演算子](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、私は可能な限り「タップ」のままにしておきます(IMHOは不可欠で不明なコードを促進します) – tokland

+0

ありがとうございました。また、タップについて学ぶこともありがたいです。メタ質問:私の質問を編集していただきありがとうございます。私は編集を受け入れるために取る必要があるいくつかのステップはありますか? – 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

@ダン私はもう少しあなたを追加しました。 – Kyle

+0

私は2倍の投票をしたいと思います。私はあなたの2番目のアイデアはより明確で短いと思いますが、@澤はadd +条件付き削除をしないようにしてくれます。決してkeep_ifのことを聞いたことがなく、それを学んでいただければ幸いです! – danh

関連する問題