Руби несколько именованных аргументов - PullRequest
4 голосов
/ 10 января 2010

Я очень плохо знаком с ruby ​​и пытаюсь написать веб-приложение с использованием инфраструктуры rails. В процессе чтения я видел, как методы вызываются так:

some_method "first argument", :other_arg => "value1", :other_arg2 => "value2"

Где вы можете передать неограниченное количество аргументов.

Как создать метод в ruby, который можно использовать таким образом?

Спасибо за помощь.

Ответы [ 4 ]

17 голосов
/ 11 января 2010

Это работает, потому что Ruby предполагает, что значения Hash, если вы вызываете метод таким образом.

Вот как бы вы определили один из них:

def my_method( value, hash = {})
  # value is requred
  # hash can really contain any number of key/value pairs
end

И вы могли бы назвать это так:

my_method('nice', {:first => true, :second => false})

Или

my_method('nice', :first => true, :second => false )
3 голосов
/ 11 января 2010

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

def funcUsingHash(input)
    input.each { |k,v|
        puts "%s=%s" % [k, v]
    }
end

funcUsingHash :a => 1, :b => 2, :c => 3

Узнайте больше о хешах здесь http://www -users.math.umd.edu / ~ dcarrera / ruby ​​/ 0.3 / chp_03 / hashes.html

1 голос
/ 11 января 2010

Может быть, * аргументы могут вам помочь?

def meh(a, *args)
 puts a
 args.each {|x| y x}
end

Результат этого метода

irb(main):005:0> meh(1,2,3,4)
1
--- 2
--- 3
--- 4
=> [2, 3, 4]

Но я предпочитаю этот метод в моих сценариях.

0 голосов
/ 27 февраля 2013

Вы можете сделать последний аргумент необязательным хешем для достижения этого:

def some_method(x, options = {})
  # access options[:other_arg], etc.
end

Однако в Ruby 2.0.0, как правило, лучше использовать новую функцию, называемую аргументы ключевого слова :

def some_method(x, other_arg: "value1", other_arg2: "value2")
  # access other_arg, etc.
end

Преимущества использования нового синтаксиса вместо использования хеша:

  • Меньше набирается для доступа к необязательным аргументам (например, other_arg вместо options[:other_arg]).
  • Легко указать значение по умолчанию для необязательных аргументов.
  • Ruby автоматически обнаружит, что вызывающее лицо использовало неверное имя аргумента, и выдаст исключение.

Одним из недостатков нового синтаксиса является то, что вы не можете (насколько я знаю) легко отправить все аргументы ключевого слова в какой-либо другой метод, потому что у вас нет хеш-объекта, который их представляет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...