2

我正在阅读Why's Poignant Guide to Ruby,我遇到了这个代码示例,其中他向 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]
4

2 回答 2

5

它正是这样做的。@@syllables是一个散列数组,因此它将第一个值移出数组,这是一个散列。然后它使用拆分字符串作为键来访问它。

self.split( '-' )返回一个字符串数组,并将其映射collect为用散列中的值替换它。

重要的部分是复制数组以避免破坏原始数组,@@syllables因此您可以移动副本。

于 2013-01-28T22:32:52.403 回答
-1

这是正在发生的事情:

parts = self.split('-')

正在将字符串转换为:

['Paij', 'ree'] # an Array

下一个有问题的块:

signif = parts.collect do |p|
  syllables.shift[p]
end

将数组中的每个实例传递给块,并从变量中['Paij', 'ree'] (parts variable)返回匹配的值。@@syllables

于 2013-01-28T22:39:26.773 回答