(一元)操作符在这个Ruby代码中做了什么?
给定Ruby代码
line = "first_name=mickey;last_name=mouse;country=usa"
record = Hash[*line.split(/=|;/)]
我理解除了*
运算符之外的第二行中的所有内容 - 它在做什么以及文档在哪里? (正如你可能猜到的,寻找这个案例很难......)
*
是splat操作符。
它将一个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,但您确实需要了解它。
链接地址: http://www.djcxy.com/p/53631.html