Подтвердить что ты не робот

Как методы используют хэш-аргументы в Ruby?

Я видел хэш-аргументы, используемые в некоторых библиотечных методах, которые я изучал.

например.

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

Может кто-нибудь объяснить, как метод использует такие аргументы, и как вы могли бы создать метод, который использует аргументы Hash?

4b9b3361

Ответ 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

Ответ 6

Вот как я это делаю:

def my_method(title, args)
  puts title
  puts args

параметры передачи:

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