(一元)*运算符在这个Ruby代码中做什么?
给定Ruby代码
line = "first_name=mickey;last_name=mouse;country=usa" record = Hash[*line.split(/=|;/)]
我理解除了*
运算符之外的第二行中的所有内容 – 它在做什么以及文档在哪里? (正如你可能猜到的,搜索这个案子很难…)
*
是摔跤运算符。
它将一个Array
展开成一个参数列表,在这个例子中是Hash.[]
方法的一个参数列表。 (更确切地说,它扩展了在Ruby 1.9中响应to_ary
/ to_a
或to_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,但是您需要了解它。