Rubyリファレンス日記

2010-08-29

最近のRubyのバージョン

8月半ばにRuby 1.8.7、1.9.1が更新され、1.9.2が正式版になっています。

  • 1.8.6-p399 - 2010/02/04
  • 1.8.7-p302 - 2010/08/16
  • 1.9.1-p430 - 2010/08/16
  • 1.9.2-p0 - 2010/08/18

これらに合わせて、Linuxへのインストールアップデートしました。

おもなポイント:

2010-08-01

undef_methodはクラスにメソッドを追加する?

Module#undef_methodを使うと、「親クラスのメソッドは子クラスで未定義にできる。子クラスで未定義にしたメソッドを孫クラスから呼ぶと未定義になる」ということに気づきました。つまり、「孫→子→親」とメソッドを探すとき、子をスルーして親のメソッドを呼ぶのではなく、子の「未定義」にぶつかるということです。

動作としては自然ですが、どうなっているのでしょう。

続きを読む

append_featuresとextend_object

Module#append_featuresはModule#includeの本体で、Module#extend_objectはObject#extendの本体です。

続きを読む

2010-07-26

Module#freezeの謎

これは読んでも役に立たない記事です。

続きを読む

2010-07-22

「サブクラス化するのは、スーパークラスの実装をよく知っているときに限るべきだ」

Rubyでは、サブクラスで親クラスのprivateメソッドやインスタンス変数を上書きしてしまい、見付けづらいバグを出すことがあります。

このことについて、オライリーの『プログラミング言語Ruby』P248では、次のように述べています(P250も参照)。

Rubyサブクラス化するのは、スーパークラスの実装をよく知っているときに限るべきだ。クラスのパブリックAPIだけが必要で、その実装は不要なら、クラスを継承するのではなく、カプセル化と委譲によってクラスの機能を拡張すべきだ。

えー。RailsではActiveRecord::BaseやActionController::Baseを継承しないと何もできないのに。

私はRailsのソースはちょくちょく眺めていますが、すべて把握するのは手に負えないし、初心者には「Railsのソース見ろ」は無理な話だし、どうしたものか。

私の経験では、Railsコントローラで@templateという変数を作って、「何でエラーが出るんだろう」としばらく悩んだことがあります。

2010-07-11

Rubyのクラスとモジュールは同じもの

Rubyを覚えるときは、「Rubyにはクラスとモジュールというものがある」と考えるより、「Rubyのクラスとモジュールは(ほとんど)同じもの」と考えるほうが分かりやすいんじゃないかなあ、という気がしてきました。

クラスとモジュールの違いは、次の5つくらい。これ以外はいっしょ。

モジュールはクラスの一種」とか「モジュールは特殊なクラス」と考えるのがいいのではないか。ClassクラスはModuleクラスのサブクラスではありますが。