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

给定Ruby代码

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

我理解除了*运算符之外的第二行中的所有内容 – 它在做什么以及文档在哪里? (正如你可能猜到的,搜索这个案子很难…)

*摔跤运算符。

它将一个Array展开成一个参数列表,在这个例子中是Hash.[]方法的一个参数列表。 (更确切地说,它扩展了在Ruby 1.9中响应to_ary / to_ato_a所有对象。)

为了说明,以下两个陈述是相同的:

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

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

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

一些更详细的信息在这里 。

splat运算符将解包传递给函数的数组,以便将每个元素作为单独的参数发送给函数。

一个简单的例子:

 >> def func(a, b, c) >> puts a, b, c >> end => nil >> func(1, 2, 3) #we can call func with three parameters 1 2 3 => nil >> list = [1, 2, 3] => [1, 2, 3] >> func(list) #We CAN'T call func with an array, even though it has three objects ArgumentError: wrong number of arguments (1 for 3) from (irb):12:in 'func' from (irb):12 >> func(*list) #But we CAN call func with an unpacked array. 1 2 3 => nil 

而已!

每个人都提到,这是一个“啪”。 寻找Ruby语法是不可能的,而且我在其他问题上提出了这个问题。 这部分问题的答案是你搜索

 asterisk in ruby syntax 

在谷歌。 谷歌在那里为你,只是把你看到的话。

Anyhoo,就像很多Ruby代码一样,代码非常密集。 该

 line.split(/=|;/) 

制作一个SIX元素数组, first_name, mickey, last_name, mouse, country, usa 。 然后使用图示将其变成哈希。 现在,Ruby人总是会让你看看Splat方法,因为所有的东西都在Ruby中暴露出来。 我不知道它在哪里,但是一旦你有了,你会看到它运行一个for数组,并建立哈希。

你会在核心文档中寻找代码。 如果你不能找到它(我不能),你会尝试写这样的代码(这是有效的,但不是类似Ruby的代码):

 line = "first_name=mickey;last_name=mouse;country=usa" presplat = line.split(/=|;/) splat = Hash.new for i in (0..presplat.length-1) splat[presplat[i]] = presplat[i+1] if i%2==0 end puts splat["first_name"] 

那么Ruby团伙将能够告诉你为什么你的代码是愚蠢的,坏的,或者是错误的。

如果您已经阅读了这些内容,请阅读Hash文档,该文档不解释splat,但是您需要了解它。

Interesting Posts