12

誰かが次の方法を短くするのを手伝ってくれますか? 私はこれで始めました。

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

次に、オプションのキーを追加します。私が考えることができる最も簡潔な構文は次のとおりです。

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

修正した方法は機能しますが、仮想インクの無駄遣いに不満があります。短くする方法はありますか?ハッシュリテラルに三項演算子を使用できることはわかってい"foo" => "bar"ますが、それは条件の各分岐でペアの繰り返しを強制する (私が思うに) ことになり、これも初期よりわずかに少なくなります。

4

2 に答える 2

12
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
于 2013-01-05T20:28:12.540 に答える
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

于 2013-01-05T20:21:22.720 に答える