私が学んできたように、いくつかのライブラリメソッドで使用されるハッシュ引数を見ました。
例えば。、
list.search(:titles, genre: 'jazz', duration_less_than: 270)
メソッドがこのような引数を使用する方法と、ハッシュ引数を使用するメソッドを作成する方法を誰かが説明できますか?
例:
def foo(regular, hash={})
puts "regular: #{regular}"
puts "hash: #{hash}"
puts "a: #{hash[:a]}"
puts "b: #{hash[:b]}"
end
foo("regular argument", a: 12, :b => 13)
hash={}
を使用して、最後の引数がハッシュであり、デフォルト値が空のハッシュであることを指定します。今、私が書くとき:
foo("regular argument", a: 12, :b => 13)
実際には、次の構文糖衣です。
foo("regular argument", {a: 12, :b => 13})
また、{a: 12}
は{:a => 12}
の構文糖衣です。
これらすべてを組み合わせると、他の言語の名前付き引数に似た構文が得られます。
Ruby 2.xでは、**
ハッシュスプラット:
def foo( ordered_argument, **named_arguments )
puts "Ordered argument: #{ordered_argument}"
puts "Named arguments: #{named_arguments}"
end
foo( :titles, genre: 'jazz', duration_less_than: 270 )
#=> Ordered argument: titles
#=> Named arguments: {:genre=>"jazz", :duration_less_than=>270}
Rubyメソッド呼び出しの引数リストがfoo: 'bar'
や'foo' => 1
などの1つ以上のキーと値のペアで終わる場合、Ruby collectsそれらすべてを単一のハッシュに入れ、そのハッシュを最後のパラメーターとして渡します。あなたはirb
でそれを見ることができます:
irb(main):002:0> puts foo: 'bar', baz: 'quux'
{:foo=>"bar", :baz=>"quux"}
=> nil
したがって、このハッシュを受け取るために、作成中のメソッドにオプションの最後のパラメーターを追加できます。通常は、デフォルトで空のハッシュに設定します。パラメーターは任意に呼び出すことができますが、options
は一般的な名前です。
def my_method(a, b, c, options = {})
...
end
Railsを使用している場合の便利なコツ:プレーンな文字列と記号を同等のものとして扱うと便利なことがよくあります。 Railsは、symbolize_keys!
メソッドをHash
に追加して、すべての文字列キーをシンボルに変換します。
def my_method(a, b, c, options = {})
options.symbolize_keys!
...
end
次の2つのオプションのいずれかを実行します。
1-メソッドに渡す引数が多数ある場合、次のようなハッシュを使用します。
some_method({titles => 'titulo', genre => 'jazz', duration_less_than => 270})
または
my_hash = {titles => 'titulo', genre => 'jazz', duration_less_than => 270}
some_method(my_hash)
そして
def some_method(hash_options)
#important code
end
2-オプションはより「伝統的」になります
some_method('titulo', 'jazz', 270)
def some_method(titles, genre, duration_less_than)
#important code
end
Ruby 2.0なので、キーワード引数を使用できます [1] [2] 単一のHashパラメーターとは対照的に。
def foo(keyword_arg: 'bar')
keyword_arg
end
そして、それがどのように振る舞うかです。
> foo
=> "bar"
> foo(keyword_arg: 'baz')
=> "baz"
これは私がそれを行う方法です:
def my_method(title, args)
puts title
puts args
パラメータを渡す:
my_method('test title', a: 'foo', b: 'bar')
# => test title
# => '{:a => 'foo', :b => 'bar'}