FIVETEESIXONE

Study for Ruby Association Certified Ruby Programmer


Ruby 技術者認定試験が version 2.1 に更新されて、更に「今なら不合格のときの再受験が無料キャンペーン中!」らしいので受験してみます。全然受験するつもりなんてなかったのに、どうもこういうキャンペーンには弱いみたいです。

まずは Silver ですが、近所で受験できる直近の日を選んだので、もう試験まで数日しかありません。なので、ドキュメントをちゃんと読んでる時間なんてどこにもありません。一応、1.8 の頃の攻略本なら持っているので、とりあえず、そのときから比べてわかりやすく変更されているところを適当にだーっと見ていきます。

数値リテラル

追加されたもの

  • 有理数

    • 42r
    • 3.14r
  • 複素数

    • 42i
    • 3.14i
  • 虚数部が有理数の複素数

    • 42ri
    • 3.14ri

変更されたもの

  • 文字 a を表す String

    • ?a
  • コントロール a を表す String

    • ?\C-a
  • メタ a を表す String

    • ?\M-a
  • メタ-コントロール a を表す String

    • ?\M-\C-a

「?a とかこれ数値なのかよ?」って気もしますが、Ruby 1.8 ではその文字に対応する文字コードが返ってきていました。このように変更された経緯は知りませんが、M17N で文字コード関連が大きく変わったことが理由な気がします。

文字列リテラル

追加されたもの

Unicode のバックスラッシュ記法が追加されています。

  • \unnnn

    • Unicode 文字 (n は 0-9, a-f, A-F、16進数4桁で指定)
  • \u{nnnn}

    • Unicode 文字列 (n は 0-9, a-f, A-F)。nnnnは16進数で1桁から6桁までで指定可能。 スペースかタブ区切りで複数の Unicode 文字を指定できる。
> "\u{30eb 30d3 30fc a}"
"ルビー\n"

ハッシュリテラル

追加されたもの

  • { a:"A", b:"B", c:"C" }

    • { :a => "A", :b => "B", :c => "C" } と同じ。キーはシンボル。

% 記法

追加されたもの

  • %i!STRING!

    • 要素がシンボルの配列 (空白区切り)
  • %I!STRING!

    • 要素がシンボルの配列 (空白区切り)。式展開、バックスラッシュ記法が有効

lambda

lambda を以下のようにも書けるようになりました。

今までの書き方

foo = lambda do |x|
  x ** 2
end

pry(main)> foo.call(3)
#=> 9

追加された書き方

foo = -> (x) do
  x ** 2
end

foo.call(3)
#=> 9

うーん、個人的にこの lambda の書き方には全然馴染めない。

メソッドのキーワード引数

メソッドにキーワード引数を設定できるようになりました。

def hello(first_name: 'Jim', last_name: 'Morrison')
  puts "Hello #{first_name} #{last_name}"
end

hello(last_name: "Orourke")
Hello Jim Orourke

キーワード引数にデフォルト値を設定しないこともできます。

def hello(first_name:, last_name: 'Morrison')
  puts "Hello #{first_name} #{last_name}"
end

hello(last_name: "Orourke")
ArgumentError: missing keyword: first_name

他言語化 (M17N)

M17N ではかなり色々変わっているので、表面だけちょっと眺めて、あとは試験を受けてから (落ちてから?) ちゃんと見ることにします…

$KCODE

Ruby 1.8 では、スクリプト中のマルチバイト文字列エンコーディングは特殊なグローバル変数 $KCODE で指定していましたが、Ruby 1.9 以降では、この変数は何の意味も持たなくなりました。スクリプトのエンコーディングを指定するには、次のマジックコメントを使います。

マジックコメント

スクリプトのエンコーディングを指定するために使うもので、スクリプトファイルの1行目に以下のようなコメントを記載します。

# coding: euc-jp
# encoding: euc-jp
# -*- coding: euc-jp -*-
# vim:set fileencoding=euc-jp:

ただし、Ruby 2.0 からはデフォルトのエンコーディングに UTF-8 が使われるようになったので、多くの場合マジックコメントを記載する必要はなくなっています。

文字列のエンコーディング

文字列がエンコーディング情報を持つようになっています。リテラル、および I/O から文字列を生成するときには注意が必要とのこと。文字列のエンコーディングに関するメソッドには主に以下があります。

  • String#encode

    • 文字列のエンコーディングを変換した新しい文字列を生成して返す
  • String#force_encoding

    • 文字列のエンコーディング情報を破壊的に書き変える
  • String#encoding

    • 文字列のエンコーディング情報を取得

7bit クリーンな文字列

7bit クリーンな文字列とは、ASCII 互換のエンコーディングにおいて、US-ASCII に含まれる \x00-\x7F の範囲の文字列を指します。これらの 7bit クリーンな文字列は、他の ASCII 互換エンコーディングを持つ文字列との結合・比較が可能であるとのことです。

a = "abc"
e = a.encode("EUC-JP")
u = a.encode("UTF-8")
p e == u                           #=> true
p e + u                            #=> "abcabc"
p "あ" + e                         #=> "あabc"
p "あ" + u                         #=> "あabc"

ファイルを開くときのエンコーディング指定

ファイルをオープンするときに、r や w のモードに加えて、エンコーディングの指定もできるようになっています。

文字列 ("mode" か "mode:ext_enc" か "mode:ext_enc:int_enc" という形式) か 整数 (File::Constants モジュールの定数の論理和) を組み合わせて指定できます。ここでは文字列での指定のみ例を示します。

# ファイルを UTF-8 で開く (読み込みモード)
open(path_to_file, "r:utf-8")

# EUC-JP のファイルを UTF-8 に変換して開く (読み込みモード)
open(path_to_file, "r:euc-jp:utf-8")

ハッシュの要素の順序

ハッシュに含まれる要素の順序は、Ruby 1.8 では不定でしたが、キーの追加された順序で列挙されるように変更されました。

foo = {a:1, b:2, c:3, d:4}

foo.keys
#=> [:a, :b, :c, :d]

foo.values
#=> [1, 2, 3, 4]

その他、見てて気付いた変わってるとこ

  • String#slice(n) が文字コードではなく文字を返すようになった ([] も同様)
  • Hash#select が配列ではなくハッシュを返すようになった
  • メソッドの定義 (def) が nil ではなくメソッドのシンボルを返すようになった

とりあえず今回はこんなとこで。