52

私はプログラミングRuby - 実用的なプログラマーガイドを読んでいて、このコードに出くわしました:

class SongList
  def [](key)
    if key.kind_of?(Integer)
      return @songs[key]
    else
      for i in 0...@songs.length
        return @songs[i] if key == @songs[i].name
      end
    end
    return nil
  end
end

[ ] メソッドの定義方法がわかりません。

キーが [ ] の外側にあるのに、メソッドが呼び出されると [ ] の内側にあるのはなぜですか?

キーを括弧なしにすることはできますか?

これを書くにはもっと良い方法があり、機能する独自の方法を書く方法を知っていますが、この [ ] メソッドは私を困惑させるだけです...どんな助けも大歓迎です、ありがとう

4

4 に答える 4

52

それは単なる構文糖です。メッセージ送信に変換される特定の構文パターンがあります。特に

a + b

と同じです

a.+(b)

、、、、、、 、、 、、、、、、および==にも同じことが適用されます。!=<><=>=<=>===&|*/-%**>><<!===~!~

また、

!a

と同じです

a.!

についても同様~です。

それで、

+a

と同じです

a.+@

についても同様-です。

プラス、

a.(b)

と同じです

a.call(b)

セッター用の特別な構文もあります。

a.foo = b

と同じです

a.foo=(b)

最後になりましたが、インデックス作成には特別な構文があります。

a[b]

と同じです

a.[](b)

a[b] = c

と同じです

a.[]=(b, c)
于 2012-04-05T01:19:53.370 に答える
42

多くの言語とは異なり、rubyのメソッドにはいくつかの特殊文字を含めることができます。その1つは、配列ルックアップ構文です。

ハッシュ内のアイテムを取得するときにそれを逆にしたい独自のハッシュクラスを実装する場合は、次のようにすることができます。

class SillyHash < Hash

  def [](key)
    super.reverse
  end

end

次のようにハッシュを呼び出すことで、これを証明できます。

a = {:foo => "bar"}
 => {:foo=>"bar"} 
a.[](:foo)
 => "bar" 
a.send(:[], :foo)
 => "bar" 

したがって、def []は、実行時に使用されるメソッドを定義しました。my_array["key"] 奇妙に見える可能性のある他のメソッドは次のとおりです。

class SillyHash < Hash

  def [](key)
    super.reverse
  end

  def []=(key, value)
    #do something
  end

  def some_value=(value)
    #do something
  end

  def is_valid?(value)
    #some boolean expression
  end

end

明確にするために、[]メソッドの定義は配列やハッシュとは無関係です。次の(考案された)例を見てください。

class B
  def []
    "foo"
  end
end

 B.new[]
 => "foo" 
于 2012-04-04T20:43:43.660 に答える
8

角括弧は、メソッドとしてArray#size持っているようなメソッド名Array#[]であり、他のメソッドと同じように使用することもできます:

array = [ 'a', 'b', 'c']
array.[](0) #=> 'a'
array.[] 1  #=> 'b'
array[2]    #=> 'c'

最後のものはシンタックス シュガーのようなもので、最初のものとまったく同じことを行います。似たArray#+ような作品:

array1 = [ 'a', 'b' ]
array2 = [ 'c', 'd' ]
array1.+(array2) #=> [ 'a', 'b', 'c', 'd' ]
array1.+ array2  #=> [ 'a', 'b', 'c', 'd' ]
array1 + array2  #=> [ 'a', 'b', 'c', 'd' ]

次のように数字を追加することもできます。

1.+(1) #=> 2
1.+ 1  #=> 2
1 + 1  #=> 2

/*、その他にも同じことが言え-ます。

于 2012-04-04T21:00:26.953 に答える