title-logo

Study for Ruby Association Certified Ruby Programmer

November 14, 2014

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

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

数値リテラル

追加されたもの

変更されたもの

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

文字列リテラル

追加されたもの

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

> "\u{30eb 30d3 30fc a}"
"ルビー\n"

ハッシュリテラル

追加されたもの

% 記法

追加されたもの

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 から文字列を生成するときには注意が必要とのこと。文字列のエンコーディングに関するメソッドには主に以下があります。

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]

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

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