Как передать несколько аргументов в метод ruby в виде массива?
-
06-07-2019 - |
Вопрос
У меня есть метод в файле помощника rails, как этот
def table_for(collection, *args)
options = args.extract_options!
...
end
и я хочу иметь возможность вызывать этот метод следующим образом
args = [:name, :description, :start_date, :end_date]
table_for(@things, args)
, чтобы я мог динамически передавать аргументы, основанные на фиксации формы. Я не могу переписать метод, потому что я использую его в слишком многих местах, как еще я могу это сделать?
Решение
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)
Другие советы
Просто назови это так:
table_for(@things, *args)
Оператор splat
( *
) выполнит эту работу без изменения метода.
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
Не связан с StackOverflow