web-dev-qa-db-ja.com

メソッドはRubyでハッシュ引数をどのように使用しますか?

私が学んできたように、いくつかのライブラリメソッドで使用されるハッシュ引数を見ました。

例えば。、

list.search(:titles, genre: 'jazz', duration_less_than: 270)

メソッドがこのような引数を使用する方法と、ハッシュ引数を使用するメソッドを作成する方法を誰かが説明できますか?

34
Senjai

例:

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}の構文糖衣です。

これらすべてを組み合わせると、他の言語の名前付き引数に似た構文が得られます。

53
Idan Arye

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}
28
Boris Stitnicky

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
11

次の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
3
M.Octavio

Ruby 2.0なので、キーワード引数を使用できます [1] [2] 単一のHashパラメーターとは対照的に。

def foo(keyword_arg: 'bar')
  keyword_arg
end

そして、それがどのように振る舞うかです。

> foo
=> "bar"
> foo(keyword_arg: 'baz')
=> "baz"
  1. http://robots.thoughtbot.com/Ruby-2-keyword-arguments
  2. http://brainspec.com/blog/2012/10/08/keyword-arguments-Ruby-2-0/
3
Dennis

これは私がそれを行う方法です:

def my_method(title, args)
  puts title
  puts args

パラメータを渡す:

my_method('test title', a: 'foo', b: 'bar')
  # => test title
  # => '{:a => 'foo', :b => 'bar'}
2
tokhi