Как методы используют хэш-аргументы в Ruby?
Я видел хэш-аргументы, используемые в некоторых библиотечных методах, которые я изучал.
например.
list.search(:titles, genre: 'jazz', duration_less_than: 270)
Может кто-нибудь объяснить, как метод использует такие аргументы, и как вы могли бы создать метод, который использует аргументы Hash?
Ответы
Ответ 1
Пример:
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}
.
Когда все это объединяется вместе, вы получаете синтаксис, похожий на именованные аргументы на других языках.
Ответ 2
В Ruby 2.x вы можете использовать **
hash splat:
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}
Ответ 3
Когда список аргументов вызова метода Ruby заканчивается одной или несколькими парами ключ-значение, например foo: 'bar'
или 'foo' => 1
, Ruby собирает их все в один хеш и передает этот хеш в качестве последнего параметра. Вы можете видеть это в 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
Ответ 4
Я бы сделал один из двух вариантов:
1- Если a получил большое количество аргументов, чтобы перейти в метод, я бы использовал хэш, как это:
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
Ответ 5
С Ruby 2.0 вы можете использовать аргументы ключевых слов [1] [2] в отличие от одного параметра Hash.
def foo(keyword_arg: 'bar')
keyword_arg
end
И вот как он себя ведет.
> foo
=> "bar"
> foo(keyword_arg: 'baz')
=> "baz"
Ответ 6
Вот как я это делаю:
def my_method(title, args)
puts title
puts args
параметры передачи:
my_method('test title', a: 'foo', b: 'bar')
# => test title
# => '{:a => 'foo', :b => 'bar'}