【问题标题】:Using Array#shift with square brackets (Ruby)使用带有方括号的 Array#shift (Ruby)
【发布时间】:2013-01-28 22:19:23
【问题描述】:

我正在阅读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]

【问题讨论】:

    标签: ruby shift


    【解决方案1】:

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

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

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

    【讨论】:

    • 哦。再看一遍,如果你这样写会更容易看出发生了什么:syllables.shift.[](p)。所以syllables.shift 返回音节数组中的第一个哈希,然后.[](p) 返回与该哈希中的p 键关联的值。 .collect 然后将其添加到 signif 数组中!感谢您的帮助!
    • 与其说是添加,不如说是在新数组中替换它。但是是的,就是这样
    【解决方案2】:

    这是怎么回事:

    parts = self.split('-')
    

    正在将字符串转换为:

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

    下一个有问题的区块:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-02
      • 2015-06-26
      • 2023-04-10
      • 2016-07-17
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多