Как передать несколько аргументов в метод ruby ​​в виде массива? - PullRequest
61 голосов
/ 06 мая 2009

У меня есть метод в файле помощника рельсов, как это

def table_for(collection, *args)
 options = args.extract_options!
 ...
end

и я хочу иметь возможность вызывать этот метод следующим образом

args = [:name, :description, :start_date, :end_date]
table_for(@things, args)

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

Ответы [ 3 ]

88 голосов
/ 06 мая 2009

Ruby хорошо обрабатывает несколько аргументов.

Вот довольно хороший пример.

def table_for(collection, *args)
  p collection: collection, args: args
end

table_for("one")
#=> {:collection=>"one", :args=>[]}

table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}

table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}

(Выход вырезан и вставлен из IRB)

56 голосов
/ 06 мая 2009

Просто назовите это так:

table_for(@things, *args)

Оператор splat (*) выполнит эту работу без изменения метода.

0 голосов
/ 18 июня 2015
class Hello
  $i=0
  def read(*test)
    $tmp=test.length
    $tmp=$tmp-1
    while($i<=$tmp)
      puts "welcome #{test[$i]}"
      $i=$i+1
    end
  end
end

p Hello.new.read('johny','vasu','shukkoor')
# => welcome johny
# => welcome vasu
# => welcome shukkoor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...