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-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 名前 〜 endで定義する。モジュールはmodule 名前 〜 end で定義する。
- クラスは継承できる。モジュールはできない。
- クラスはインスタンスを作成(new)できる。モジュールはできない。
- モジュールはMixinに使える(include, extendの引数に渡せる)、クラスはMixinに使えない。
- クラスはClassクラスのオブジェクト、モジュールはModuleクラスのオブジェクト。
「モジュールはクラスの一種」とか「モジュールは特殊なクラス」と考えるのがいいのではないか。ClassクラスはModuleクラスのサブクラスではありますが。