аргументы метода - PullRequest
       2

аргументы метода

18 голосов
/ 17 марта 2010

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

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

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

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

Ответы [ 6 ]

37 голосов
/ 17 марта 2010

Руби на самом деле не имеет ключевых аргументов.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
7 голосов
/ 04 августа 2013

Начиная с Ruby 2.0, ruby ​​ имеет аргументы для ключевых слов .

def my_method(arg1, name: 'defaultName', number: 0)
  puts arg1, name, number
end
6 голосов
/ 03 апреля 2012

Я согласен с принятым ответом Самира Талвара и Кристоферрайта. Единственным потенциальным недостатком является то, что вы не получите предупреждений, если вы используете неверный символ ключевого слова в качестве аргумента или при поиске параметра он просто игнорируется. Если вас это беспокоит, гем 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

Драгоценный камень также предоставляет несколько других функций, которые могут вас не интересовать, например, возможность указать, что требуется ключевое слово. Я давно уже пользуюсь им.

(Отказ от ответственности: я автор драгоценного камня.)

1 голос
/ 17 марта 2010

Вам просто нужно определить метод, где одним из параметров является хеш. Это на самом деле довольно просто.

def method(arg1, params)
  name = params[:name]
  number = params[:number]

А затем назовите это как:

method(arg1, :name => 'Eric', :number => 2)

Две ноты:

  1. В Ruby вам не нужно заключать хеш параметров в {} при вызове метода в большинстве случаев, если только у вас нет чего-то сложного, например, передачи нескольких хешей. В этом случае убедитесь, что вы окружили эти параметры {}
  2. Ruby имеет динамическую типизацию, поэтому вам не нужно говорить, что params - это хеш, когда вы определяете метод.
0 голосов
/ 27 ноября 2017

В 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
0 голосов
/ 17 марта 2010

Поскольку Ruby набирается динамически, просто выполните:

def my_method(arg1, arg2)
  #things
end

пример:

my_method(:test, {:somehash => "yay"})

или

my_method :test, :somehash => "yay"

или

my_method(:test, :somehash => "yay")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...