(一元)操作符在这个Ruby代码中做了什么?

给定Ruby代码

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

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


*是splat操作符。

它将一个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,但您确实需要了解它。

链接地址: http://www.djcxy.com/p/53631.html

上一篇: What does the (unary) * operator do in this Ruby code?

下一篇: foggy on asterisk in python