我正在阅读为什么是Ruby的Poignant指南,我发现了这个代码示例,其中他向String类添加了一个类变量和一个实例方法。这个想法是,给定一个外星人的名字,如“Paij-Ree”,我们可以运行类似的东西
"Paij-ree".determine_significance # returns "Personal AM"
以下是代码:
class String
@@syllables = [
{ 'Paij' => 'Personal',
'Gonk' => 'Business',
'Blon' => 'Slave',
'Stro' => 'Master',
'Wert' => 'Father',
'Onnn' => 'Mother' },
{ 'ree' => 'AM',
'plo' => 'PM' }
]
# a method to determine what a certain
# name of his means
def determine_significance
parts = self.split( '-' )
syllables = @@syllables.dup
signif = parts.collect do |p|
syllables.shift[p]
end
signif.join( ' ' )
end
end
我的问题:在Array #shift方法之后有哪些方括号的collect块中发生了什么?我只能找到像这样使用它的例子:
letters = ['a','b','c']
letters.shift # returns "a"
这里发生了什么?
syllables.shift[p]
答案 0 :(得分:5)
正是这样做的。 @@syllables
是一个哈希数组,因此它将第一个值移出数组,这是一个哈希值。然后它使用拆分字符串作为密钥访问它。
self.split( '-' )
返回一个字符串数组,并使用collect
映射,以将其替换为哈希值。
重要的一点是,数组是重复的,以避免破坏原始@@syllables
,以便您可以移动副本。
答案 1 :(得分:-1)
这是正在发生的事情:
parts = self.split('-')
将字符串转换为:
['Paij', 'ree'] # an Array
下一个问题:
signif = parts.collect do |p|
syllables.shift[p]
end
将数组['Paij', 'ree']
(parts variable)
中的每个实例传递给块,并从@@syllables
变量返回匹配的值。