4

重複の可能性:
undef-なぜrubyでメソッドの定義を解除したいのですか?

誰かがルビーのundefの実用的な使用法をレイアウトできますか?私はそれが組み込まれていないjavascriptやpythonのような言語から来ています。もちろんjavascriptのような言語でそれをシミュレートすることができます:

var obj = { func:function(){alert("works")} }
obj.func() // -> "works"
delete(obj["func"])
obj.func() //->obj.func() is not a function

しかし、私は実際にそれを使用したことはありません。undefが実際に役立つ一般的な状況はありますか?

編集-「Rubyプログラミング言語」という本でこれに出くわしたばかりです。

オブジェクトのコピーを防ぐもう1つの方法は、undefを使用してcloneメソッドとdupメソッドを削除することです。さらに別のアプローチは、cloneメソッドとdupメソッドを再定義して、コピーが許可されていないことを具体的に示すエラーメッセージで例外を発生させることです。このようなエラーメッセージは、クラスを使用しているプログラマーに役立つ場合があります。

4

2 に答える 2

6

5年間一度も使ったことがないとしか言​​えません。おそらくもっと便利なことに、Rails のソース全体を grep すると 7 つのインスタンスしか表示されず、それらはすべてメタプログラミングに関連しています。(undef_method は 22 でかなり多くのインスタンスを持っています)。モジュールが混在している場合とない場合のクラスの動作をテストするのに役立つようです。

うまくいけば、誰かがそれのより一般的な使用法を指摘できます。

EDIT この前の質問を参照してください: undef - Ruby でメソッドを定義解除したいのはなぜですか?

于 2011-01-14T22:23:50.840 に答える
6

子クラスがスーパークラスで定義されたメソッドを呼び出すのをブロックする (これは実際には mongrel で使用されますsetup.rb) (言い換え):

class Item
  def set
    do_something
  end
end

class ExecItem < Item
  undef set
end

undef_methodは同じ効果があると思いますが。

于 2011-01-15T01:36:40.863 に答える