Ruby 1.9 の新機能を調べてみた

1.9.0 のリリースも近いということで、Changes in Ruby 1.9 を参考にしながら Ruby 1.9 trunk (r14828) で遊んでみた。
まあ、ほとんどは上のサイトに書いてあるとおりなんだけど、「おっ」と思った点やその他で気付いた点を以下に列挙。(既に書かれている内容はほぼ省略)

  • Changes in Ruby 1.9 のページに書いてあるけど現状に即していない点。
    • Object#__send__ は、けっきょく可視性に関わらず全てのメソッドを呼べるようになった。(__send__send! は廃止)
    • NameError は、けっきょく StandardError のサブクラスに戻った。
    • Hash#eachHash#each_pair は同じ動作になった。
    • 他にもあるかもしれないけど、とりあえず気付いたのは以上。
  • RubyGems が標準で組み込まれる
    • 機能縮小版が自動的に組み込まれる (gems_prelude.rb)
    • コマンドライン--disable-gems を指定すれば回避可能
  • StringEncoding
    • 文字列リテラル"\uHHHH" と書けるようになった。
    • $KCODE は意味をなさなくなった (使おうとすると warning が出る)
    • String#size で文字数, String#bytesize でバイト数
    • 文字列オブジェクトごとに encoding 情報を持っている。(String#encoding)
    • String#ord は、多バイト文字の場合は Unicode(UCS) が返る(ようだ)。 (追記: 勘違い)
    • String#force_encoding(encode_name) で encoding を変更. String#valid_encoding? でその文字列が正しい encoding なのか(文字列として正しいバイト表現なのか)をチェック。
a = "\xE3\x81\x82"  # UTF-8 で "あ"
p a.encoding 
#=> <Encoding:ASCII-8BIT>
a.force_encoding('UTF-8')
p a.encoding
#=> <Encoding:UTF-8>
    • ファイルの先頭付近に "# -*- encoding: UTF-8 -*-" と書いておくと、そのファイルのデフォルトエンコーディングを指定できる。
      • ファイルの途中に書いても無意味。2度目の指定も無意味。
      • デフォルトエンコーディングを指定した場合でも、8bit 文字が含まれていない場合は ASCII-8BIT になる?
# -*- encoding: UTF-8 -*-
p "a".encoding    #=> <Encoding:ASCII-8BIT>
p "".encoding   #=> <Encoding:UTF-8>
      • encoding: じゃなくて coding: でも同じ動作のようだけど、どちらが正しいんだろう?
    • コマンドラインから --encoding=UTF-8 といった指定も可能。
    • ファイルから読む場合は File.open(filename, 'r:UTF-8') とか。
    • File.open(filename, 'w:EUC-JP') とか書くと自動変換してくれるのかと思ったけど、してくれないようだ。 (追記: その後のバージョンでは変換してくれるようになった)
    • Encoding.default_external って、何の意味があるんだろう。どうやって変更するんだろう。
    • まだ全貌を掴めてない。
  • その他
    • p の返り値が nil ではなくなった。(引き数をそのまま返す。引き数なしの場合は nil)
  • 最近の話題
    • 単項演算子 ! がメソッド扱いになり、再定義できるようになった。
      • !!object で true または false に変換する、というイディオムが通用しなくなる(可能性がある)ので、ちょっとだけ気持ち悪い。
class A; def !@; "hoge"; end; end
p ! A.new  #=> "hoge"

! が再定義できると聞いて、とりあえず皆やるであろうことをやってみた。

class TrueClass
  def !@; true; end
end
p !true  #=> true

うお、再定義できた! すげえ。


後日追記。
m17n 関連について、もう少しきちんとまとめました。id:macks:20080102