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#each
とHash#each_pair
は同じ動作になった。- 他にもあるかもしれないけど、とりあえず気付いたのは以上。
- RubyGems が標準で組み込まれる
- 機能縮小版が自動的に組み込まれる (gems_prelude.rb)
- コマンドラインで
--disable-gems
を指定すれば回避可能
String
とEncoding
- 文字列リテラルで
"\uHHHH"
と書けるようになった。 $KCODE
は意味をなさなくなった (使おうとすると warning が出る)String#size
で文字数,String#bytesize
でバイト数- 文字列オブジェクトごとに encoding 情報を持っている。(
String#encoding
)- 今のところ有効らしい encoding は ASCII-8BIT, UTF-8, Shift_JIS, EUC-JP, ISO-2022-JP.
(追記: 勘違い)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 -*- 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