use*_*052 16 ruby arguments ruby-on-rails splat ruby-on-rails-3
我正在使用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
Run Code Online (Sandbox Code Playgroud)
Hol*_*ust 44
这是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
Run Code Online (Sandbox Code Playgroud)
第二种变体是在考虑以下方法时:
def bar(a, b, c)
a + b + c
end
Run Code Online (Sandbox Code Playgroud)
它只需要三个参数.您现在可以调用此方法,如下所示
my_array = [1, 2, 3]
bar(*my_array)
# returns 6
Run Code Online (Sandbox Code Playgroud)
在这种情况下应用于数组的splat将拆分它并将数组的每个元素作为单个参数传递给该方法.即使打电话,您也可以这样做foo:
foo(*my_array)
# 1. 1 <== this is the output
# 2. 2
# 3. 3
Run Code Online (Sandbox Code Playgroud)
正如您在示例方法中看到的,这些规则确实以相同的方式应用于块参数.