Ruby中可以使用一个星号*
和两个星号**
完成一些打包、解包操作,它们称为splat操作符:
两个星号的splat场景很少见,如有必要可参考上面列出的参考文章。
当splat操作符后面跟的是数组,则进行数组解包操作:解包成元素列表。这个解包效果在调用函数并传参时比较能体现出来。
def f(a,b,c,d)
p "1.#{a}"
p "2.#{b}"
p "3.#{c}"
p "4.#{d}"
end
arr=%w(aa bb cc dd)
f(*arr)
# 赋值解包:将数组解包成元素列表再赋值给arr变量
# 这过程中会创建一个新的数组保存解包后但要赋值的各元素
arr=*[1,2,3]
上面的*arr
中,splat操作符后面跟的是一个数组,所以它做了解包操作,将数组解包成了4个元素,并依次赋值给参数a、b、c、d。
当splat操作符后面跟的是一个或多个元素,则进行数组打包操作:创建一个新数组保存这些元素。这个在函数定义中比较常见,很偶尔的在赋值的时候也能见到。
def foo(a,b,*args)
p a
p b
p args #=> 打包成[3,4,5]赋值给参数args
end
foo(1,2,3,4,5)
下面的打包、解包示例比较经典:
a,*x=1,2,3 #=> a=1,x=[2,3]
a, (b, *c), *d = 1, [2, 3, 4], 5, 6
#=> a=1,b=2,c=[3, 4],d=[5, 6]