Что делает символ * (звездочка) рядом с аргументом функции и как использовать его в других сценариях?

Я использую 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.