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 メソッドの後に角かっこがある収集ブロックで何が起こっていますか? 次のように使用されている例しか見つけることができませんでした。

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 に答える