*(星号)符号在函数参数附近有啥作用以及如何在其他情况下使用它?
Posted
技术标签:
【中文标题】*(星号)符号在函数参数附近有啥作用以及如何在其他情况下使用它?【英文标题】:What does the * (asterisk) symbol do near a function argument and how to use that in others scenarios?*(星号)符号在函数参数附近有什么作用以及如何在其他情况下使用它? 【发布时间】:2011-07-12 07:58:07 【问题描述】:我正在使用 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
【问题讨论】:
【参考方案1】:这是 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
正如您在示例方法中看到的那样,这些规则确实以相同的方式应用于块参数。
【讨论】:
【参考方案2】:这是一个 splat 参数,这基本上意味着传递给该方法的任何“额外”参数都将分配给 *args。
【讨论】:
以上是关于*(星号)符号在函数参数附近有啥作用以及如何在其他情况下使用它?的主要内容,如果未能解决你的问题,请参考以下文章