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

Аргументы ключевого слова ruby ​​метода

Как я могу объявить метод с аргументами ключевого слова так же, как и рельсы. некоторые примеры могут быть

Person.find(:all, :conditions => "..."). 

Как я могу использовать символы для создания методов, аналогичных описанным выше?

Я очень новичок в рубине. Спасибо заранее!

4b9b3361

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

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