17

我正在使用 Ruby on Rails 3,我想知道*在函数参数附近存在运算符意味着什么,并了解它在其他场景中的用法。

示例场景(此方法来自 Ruby on Rails 3 框架):

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
4

2 回答 2

46

这是 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

正如您在示例方法中看到的那样,这些规则确实以相同的方式应用于块参数。

于 2011-03-09T23:51:03.833 回答
3

这是一个 splat 参数,这基本上意味着传递给该方法的任何“额外”参数都将分配给 *args。

于 2011-03-09T23:23:12.813 回答