多言語化 - Ruby 技術者認定試験改訂対策 #1

Ruby 技術者認定試験制度の改訂により Ruby のバージョンが 1.8 から 2.1 になったので、その変更点を試験対策の観点で Ruby 技術者認定試験改訂のお知らせを参考にしつつまとめていきます。第1回は多言語化についてです。

概要

Ruby 1.9 になったときに Ruby は多言語化されました。その詳細は Rubyist Magazine - Ruby M17N の設計と実装に書かれています。

試験に関係ありそうな多言語化による変更は Encoding・String に存在します。なお、Encoding は Ruby 1.9 になって新しく追加されたクラスです。また、多言語化に伴いスクリプトエンコーディングの概念が追加されたので、スクリプトエンコーディングについても理解しておく必要があります。

それぞれの変更点について解説していきます。Ruby 2.0 と Ruby 2.1 での変更点も一緒にまとめています。

スクリプトエンコーディング

まずは Ruby のスクリプトを書いて実行するときに考えなければならないスクリプトエンコーディングについてです。Ruby 1.9 で導入された概念です。後述するように Ruby 2.0 でも重要な変更が追加されています。

Ruby 1.9 からファイルの先頭にマジックコメントを追加することでスクリプトエンコーディングを指定できます。スクリプトエンコーディングはファイルごとに指定することができるようになっています。下記の指定では Ruby はファイルを UTF-8 でエンコーディングされたものとして解釈します。

# coding: utf-8

Ruby 1.9 では、マジックコメントがない場合のデフォルトスクリプトエンコーディングは US-ASCII です。しかし、Ruby 2.0 で UTF-8 に変更されました。試験では Ruby 2.1 を対象としているので、デフォルトスクリプトエンコーディングは UTF-8 になります。

Encoding クラス

文字エンコーディングのクラスです。多言語化に伴い追加されました。

Encoding クラスのインスタンスを文字列から取得することができます。

p 'あ'.encoding # => #<Encoding:UTF-8>

例えば、マジックコメントがない、文字エンコーディングが UTF-8 のファイルで、文字エンコーディングを表す文字列を取得すると下記のようになります。

p 'あ'.encoding.name # => "UTF-8"

また、マジックコメントがあり、文字エンコーディングが Shift_JIS のファイルで、文字エンコーディングを表す文字列を取得すると下記のようになります。

# coding: Shift_JIS
p 'あ'.encoding.name # => "Shift_JIS"

文字列リテラルはスクリプトエンコーディングによって文字エンコーディングが決まります。ただし、文字列ごとに文字エンコーディングを持つため、文字エンコーディングの違う文字列を混在させることもできます。

# coding: Shift_JIS
a = 'あ'
b = 'あ'.encode('UTF-8')
p a.encoding.name # => "Shift_JIS"
p b.encoding.name # => "UTF-8"

時間があれば、[Ruby 2.1.0 リファレンスマニュアル の Encoding クラス]を眺めるとより完璧だと思います。

String クラス

文字列のクラスです。多元化に伴い大きな変更があったクラスです。

Ruby 1.8 では文字列はバイト単位で扱われるので String#[] の結果は下記のようになりました。

'abc'[0]    # => 97
'abc'[0..1] # => "ab"

しかし、Ruby 1.9 では文字列は文字単位で扱われるので String#[] の結果は下記のようになります。

'abc'[0]    # => "a"
'abc'[0..1] # => "ab"

また、Ruby 1.8 では文字リテラルの結果は数値になりました。

?a # => 97

しかし、Ruby 1.9 では文字リテラルの結果は1文字の文字列になります。

?a # => "a"

Ruby 2.1 に含まれる Ruby 1.9.1 以降の NEWS ファイルを参照すると下記メソッドの追加/変更がありました。完全を期すのであればひとつひとつのメソッドのマニュアルを参照することをおすすめします。

  • String#clear
  • String#ord
  • String#getbyte, String#setbyte
  • String#chars, String#each_char
  • String#codepoints, String#each_codepoint
  • String#unpack
  • String#hash
  • String.try_convert
  • String#encoding
  • String#force_encoding, String#encode, String#encode!
  • String#ascii_only?
  • String#valid_encoding?
  • String#match
  • String#prepend
  • String#byteslice
  • String#b
  • String#lines
  • String#chars
  • String#codepoints
  • String#bytes
  • String#scrub, String#scrub!

Ruby 1.9 で導入された多言語化による変更点を駆け足で説明しました。多言語化自体は深いトピックですが試験対策という意味では深く追求する必要はないと思います。本記事で説明した「スクリプトエンコーディング」「Encoding クラス」「文字列がバイト単位ではなく文字単位」の3点を抑えて、irb でメソッドを試してみれば試験対策としては十分ではないでしょうか。

次回はリテラルについて説明します。

参考文献

関連記事