Ruby中可以使用一个星号*和两个星号**完成一些打包、解包操作,它们称为splat操作符:
* 一个星号:以数组为依据进行打包解包(参考文章 <https://www.jianshu.com/p/464460c9a0b6>)
* 两个星号:以hash为依据进行打包解包(参考文章
<https://dev.firmafon.dk/blog/drat-ruby-has-a-double-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]
热门工具 换一换