Что делает символ * (звездочка) рядом с аргументом функции и как использовать его в других сценариях?
Я использую Ruby на Rails 3 и я хотел бы знать, что означает наличие *
оператор рядом с аргументом функции и понять его использование в других сценариях.
пример сценария (этот метод был из Ruby on Rails 3 framework):
def find(*args)
return to_a.find { |*block_args| yield(*block_args) } if block_given?
options = args.extract_options!
if options.present?
apply_finder_options(options).find(*args)
else
case args.first
when :first, :last, :all
send(args.first)
else
find_with_ids(*args)
end
end
end
2 ответов
это оператор splat, который происходит от ruby (и, таким образом, не является специфичным для rails). Он может применяться двумя способами в зависимости от того, где он используется:
- чтобы "упаковать" ряд аргументов в массив
- разбить массив на список аргументов
в вашей функции вы видите оператор splat, используемый в определении функции. В результате функция принимает любое количество аргументов. Полный список аргументов будет помещен в args
как массив.
def foo(*args)
args.each_with_index{ |arg, i| puts "#{i+1}. #{arg}" }
end
foo("a", "b", "c")
# 1. a <== this is the output
# 2. b
# 3. c
второй вариант будет, когда вы рассмотрите следующий метод:
def bar(a, b, c)
a + b + c
end
для этого требуется ровно три аргумента. Теперь вы можете вызвать этот метод следующим образом
my_array = [1, 2, 3]
bar(*my_array)
# returns 6
splat, примененный в этом случае к массиву, разделит его и передаст каждый элемент массива в качестве отдельного параметра методу. Вы можете сделать то же самое, даже позвонив foo
:
foo(*my_array)
# 1. 1 <== this is the output
# 2. 2
# 3. 3
как вы можете видеть в вашем примере метод, эти правила применяются к параметрам блока таким же образом.
это аргумент splat, который в основном означает, что любые "дополнительные" аргументы, переданные методу, будут назначены *args.