最近の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へのインストールをアップデートしました。おもなポイント…

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

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

append_featuresとextend_object

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

Module#freezeの謎

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

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

Rubyでは、サブクラスで親クラスのprivateメソッドやインスタンス変数を上書きしてしまい、見付けづらいバグを出すことがあります。このことについて、オライリーの『プログラミング言語Ruby』P248では、次のように述べています(P250も参照)。 Rubyでサブ…

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

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

class_eval (module_eval)でのクラス変数とクラス定数

クラス定義の外側で、class_evalのブロックを使ってクラス変数とクラス定数にアクセスしようとすると、Ruby 1.8ではNameErrorが発生します。class_execでも同様です。コードをブロックではなく文字列で渡したときはアクセスできます。Ruby 1.9.1ではブロック…

Railsの開発環境の自動再読み込みはどうやってるのか

以前から気になっていたけど調べたことのなかったRailsのアノ機能を調べてみました。開発環境でソースを修正→ブラウザーをリロード→変更が反映、の機能です。どうやっているかというと、RubyのModule#const_missingとModule#remove_constを使っています。ソ…

Module#constantsとModule.constants

Moduleのインスタンスメソッドconstantsとクラスメソッドconstantsの区別がややこしい。 Module#constants Module.constants Module.constantsはModuleじゃなくてKernelに実装してconst_variablesみたいな名前にしたほうがいいんじゃないだろうか。

Rubyの定数は定数ではない

Rubyの定数(大文字で始まる変数)は再代入が可能です。警告は出ますが変更できます。 FOO = "hello" FOO = "world" p FOO結果: temp.rb:2: warning: already initialized constant FOO "world"RubyにはC/C++のような定数は存在せず、大文字で始まる変数は…

Rubyの == と equal? と === と eql? のまとめ

== 数値、文字列、配列などで、「等しいかどうか」「同じ内容かどうか」を調べるのに使います。別のオブジェクト(別のインスタンスへの参照)でも同じ内容ならtrueになります。Rubyでは数値と文字列の間の自動変換は行われませんので、1 == "1"はfalseです…

シンボルをどう説明するか

入門者にRubyのシンボルを説明するのは難しいですよね。

数値クラス

基本的な数値クラスのページを作りました。 Numeric Integer Fixnum Bignum Float to_sや==など基本的なメソッドだけ書いて、細かいのは後回しにする予定。

Rubyのnewとは何か

Rubyの「クラス.new」のnewは、C++やJavaのように文法の要素ではなく、ただのメソッドです。Classクラスのインスタンスメソッドnew(Class#new)です。 new (Class)

Ubuntuでのコンパイルにはreadlineが必要

UbuntuでRubyをコンパイルするには、readlineのライブラリ(libreadline6-dev)が必要です。これがないとirbでヒストリが使えなかったり、Railsのconsoleが動かなかったりします。というわけで、Linuxへのインストールのページを修正しました。

String#stripの動作

Ruby 1.9.1と1.9.2での仕様変更 Ruby 1.9の仕様では、strip、lstrip、rstripは全角空白などユニコードの空白も除去する、と思ってましたが、1.9.2でアスキーの空白だけ除去するように変更されていました。 "\u{3000}hello\u{3000}".strip #=> "hello" Ruby 1…