3

Rubyでメソッドを再定義するのがいかに簡単かについて読んでいるときに、次のことに出くわしました。

class Array
  alias :old_length :length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length

確かに、それは悪い考えですが、それがポイントになります。:lengthしかし、とととlengthを簡単に切り替えるのが気に:old_lengthなりました。old_lengthだから私はこのようにしてみました:

class Array
  alias old_length length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length

どうやら最初のバージョンと同じように、問題なく動作します。明らかに何かが欠けているように感じますが、それが何かはわかりません。

では、一言で言えば、これらの場合に:nameとが交換可能である理由は何ですか?name

4

2 に答える 2

5

メソッドはシンボルではありませんが、その名前はシンボルです。書くだけlengthでメソッドが呼び出されますlength。メソッドを実行するのではなくメソッドの名前を指定するには、シンボルを使用します。

class Array
  def show_the_difference
    puts length
    puts :length
  end
end

['three', 'items', 'here'].show_the_difference
# prints "3" for the first puts and then "length" for the second

あなたが見つけたケースは、言語の他のすべてとは異なる動作をするaliasという理由だけで、例外です。alias

于 2009-06-05T23:10:45.487 に答える
3

aliasは特別な処理を行うプリミティブであり、明らかにシンボルと生の名前の両方を取ることができます。relatedalias_methodは単なる通常のメソッドであり、通常の構文を使用する必要があります。

alias_method :old_length, :length
于 2009-06-05T23:00:20.780 に答える