2017-01-18 9 views
0

未知数の引数を受け取り、それらに対してハッシュ#digを実行するメソッドを作成しようとしています。#digラッパーメソッドで変数の動的数を受け入れる

def unknown_dig(hash, *args) 
    # do some magic? 
    hash.dig(non_array_args) 
end 

#example usage 
unknown_dig(hash, 'a', 'b', 'c') 

これは可能ですか?あなたは(あなたの代わりにそれにメソッドを呼び出すの引数としてハッシュを渡す)、それ以上の機能的なスタイルにしたい場合は

hash = { a: { b: 1 } } 
hash.dig(:a, :b) == hash.dig(*[:a, :b]) 

、:(ルビー2.3で定義されている)

+2

あなたは 'hash.dig(* args)'を探していますか? – Stefan

答えて

2

ハッシュ#掘るには、すでにこれを行いますそれは簡単です:

def hash_dig(hash, *args) 
    hash.dig(*args) 
end 
+0

どこのドキュメントが見つかりましたか?私はこれを見ていたhttp://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig – userFriendly

+0

"ルビーの掘り出し物"については、Googleのユーザーフレンドリー検索:) –

+0

ここのキーワードはスプラッシュ演算子です'*'は 'dig'自体ではありません。 – akuhn

4

Hash#digは、RubyのV2.3で私たちに授けました。以前のRubyのバージョンをサポートするには、Enumerable#reduce(別名inject)を使用できます。これは私が子供のころのやり方です。それは最初にキーkを持たないobj[k] #=> nilobj場合kブロックに渡される(h)、そのままobj場合

def dig_it(h,*keys) 
    keys.reduce(h) { |obj,k| obj && obj[k] } 
end 

h = { a: { b: 1 } } 

dig_it(h, :a, :b) 
    #=> 1 
dig_it(h, :a) 
    #=> {:b=>1} 
dig_it(h, :a, :c) 
    #=> nil 
dig_it(h, :c, :b) 
    #=> nil 

は、ハッシュ(またはobjnilかのキーkその値がある場合)その場合、obj && obj[k] #=> obj && nil #=> nil。したがってブロックに渡されるkeysの残りの各要素のブロック計算はobj && obj[k] #=> nil && obj[k] #=> nilになります。 nil[k]は例外を発生させますが、実行されることはありません。ハッシュobjに値falseのキーkがある場合、(nilではなく)以外の同じ結果が返されます。

関連する問題