Аргументы ключевого слова ruby метода
Как я могу объявить метод с аргументами ключевого слова так же, как и рельсы. некоторые примеры могут быть
Person.find(:all, :conditions => "...").
Как я могу использовать символы для создания методов, аналогичных описанным выше?
Я очень новичок в рубине. Спасибо заранее!
Ответы
Ответ 1
В Ruby нет аргументов ключевых слов. Rails использует функцию Ruby, которая позволяет опустить фигурные скобки вокруг хэша. Например, при find
мы действительно вызываем:
Person.find(:all, { :conditions => "...", :offset => 10, :limit => 10 } )
Но если хэш является последним аргументом метода, вы можете оставить фигурные скобки, и он все равно будет рассматриваться как хэш:
Person.find(:all, :conditions => "...", :offset => 10, :limit => 10)
Вы можете использовать это в своих собственных методах:
def explode(options={})
defaults = { :message => "Kabloooie!", :timer => 10, :count => 1 }
options = defaults.merge(options)
options[:count].times do
sleep options[:timer]
puts options[:message]
end
end
И затем назовите его:
explode :message => "Meh.", :count => 3
Или вызывать его без аргумента, в результате чего используются все значения по умолчанию:
explode
Ответ 2
Так как Ruby 2.0, ruby имеет аргументы ключевого слова.
def my_method(arg1, name: 'defaultName', number: 0)
puts arg1, name, number
end
Ответ 3
Я согласен с принятым ответом Самира Талвара и Кристоферрайт. Единственным потенциальным недостатком является то, что вы не получаете никаких предупреждений, если используете неправильный символ ключевого слова в качестве аргумента или при поиске опции, это просто заканчивается игнорированием. Если это что-то вас беспокоит, к нему обращается драгоценный камень hash_keyword_args. Идиома была бы
def explode(opts={})
opts = opts.keyword_args(:message => "Kabloooie!", :timer => 10, :count => 1)
opts.count.times do
sleep opts.timer
puts opts.message
end
end
Обратите внимание на использование методов доступа, чтобы вы получили NoMethodError, если вы ошибочно используете ключевое слово. И вызывающее поведение:
explode(:message => "Okay") # works
explode(:msg => "Oops") # raises ArgumentError
Драгоценный камень также предоставляет несколько других функций, которые вам могут или не нужны, например, возможность указать, что требуется ключевое слово. Я использовал его с удовольствием какое-то время.
(Отказ от ответственности: я автор драгоценного камня.)
Ответ 4
Вам просто нужно определить метод, в котором один из параметров является хэшем. Это на самом деле довольно просто.
def method(arg1, params)
name = params[:name]
number = params[:number]
И затем назовите его так:
method(arg1, :name => 'Eric', :number => 2)
Две заметки:
- В Ruby вам не нужно окружать хэш параметров в {}, когда вы вызываете метод в большинстве случаев, если у вас нет чего-то сложного, например, проходящего несколько хэшей. В этом случае убедитесь, что вы окружаете эти параметры с помощью {}
- Ruby динамически типизирован, поэтому вам не нужно указывать, что params является хешем, когда вы определяете метод.
Ответ 5
Так как Ruby вводится динамически, просто выполните:
def my_method(arg1, arg2)
#things
end
Пример:
my_method(:test, {:somehash => "yay"})
или
my_method :test, :somehash => "yay"
или
my_method(:test, :somehash => "yay")
Ответ 6
Ruby 2.0 представил реальные аргументы ключевого слова, а Ruby 2.1 добавил необходимые аргументы ключевых слов.
Там хорошая статья на https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/, я заимствовал примеры оттуда:
Ruby 2.0 +:
def exclaim(text, exclamation: '!', number: 7)
text + exclamation * number
end
exclaim('hello', number: 4) #=> 'hello!!!!'
# equivalent:
exclaim('hello', {:number => 4}) #=> 'hello!!!!'
Ruby 2.1 +:
def exclaim(text, exclamation: '!', number:)
text + exclamation * number
end
exclaim('Yo', number: 5) # => 'Yo!!!!!'
exclaim('Yo') # raises: ArgumentError: missing keyword: number