(一元)*运算符在此Ruby代码中做什么?


174

给定Ruby代码

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

除了*操作员以外,我在第二行中了解所有内容 -它在做什么,相关文档在哪里?(您可能会猜到,搜索这种情况非常困难...)

Answers:


271

*图示操作。

它将扩展Array为参数列表,在这种情况下为Hash.[]方法的参数列表。(更确切地说,它扩展了对to_ary/ to_ato_aRuby 1.9 中响应的对象。)

为了说明这一点,以下两个语句相等:

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

它也可以在不同的上下文中使用,以捕获方法定义中所有剩余的方法参数。在这种情况下,它不会扩展,而是结合在一起:

def method2(*args)  # args will hold Array of all arguments
end

这里有一些更详细的信息


36
通常,当在类似LHS的情况下使用时(每次在值上调用它时),splat会将数组拆分成单独的值;而在类似RHS的情况下使用时(任何时候在使用它时)在一些以前未定义的变量上),它将单独的值分组为一个数组。因此a,b,*c = d,e,f,*g设置a = d,b = e和c = [f,g0,g1,g2,...,gn],其中g = [g0,g1,g2,...,gn]
斜坡

2
为了完整起见,Splat运算符根据David A. Black
David Burrows在2009年

12
@rampion:很棒的评论,您只是混合了LHS和RHS。相反。
ThomasH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.