*(星号)符号在函数参数附近做什么以及如何在其他场景中使用它?

我正在使用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 

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