IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Inst. Tech View

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第42回 Ruby 2.1の新機能 2014年10月

 今回のInst. Tech Viewは、Ruby 2.1の新機能についての話題です。 

 先日RubyアソシエーションよりRuby技術者認定試験の改訂がアナウンスされました。

Ruby技術者認定試験改訂のお知らせ(10/3更新)
http://www.ruby.or.jp/ja/news/20140715.html

試験名が以下のように改訂され、Rubyの対象バージョンが2.1となりました。

「Ruby Association Certified Ruby Programmer Silver version 2.1」
「Ruby Association Certified Ruby Programmer Gold version 2.1」

これから試験を受験される方を対象に新たに試験で問われるであろうRuby2.1の新機能について紹介します。
紹介させていただく機能は以下の2点です。

■Module#refine、main.using (Ruby >= 2.1)
■Module#prepend (Ruby >= 2.0)

Module#refine、main.using

 Rubyのクラスには一度定義したクラスを再定義して拡張できる機能が備わっています。この機能をオープンクラスと呼びます。これはプログラムの挙動を動的に変えられる他の言語にはあまり見られない特徴的な機能です。

しかし、その特徴から既存のコードに影響を及ぼす可能性があるため、使い方によっては逆にバグを引き起こす原因になってしまうことがあります。
そこで、拡張範囲を制限する仕組みとして取り入れられたのがrefineメソッドとusingメソッドです。

以下のサンプルコードをご覧ください。

| module StringExtensions
| refine String {
| def to_snakecase
| split(/\s+/).map{|s| s.downcase}.join("_")
| end
| }
| end
|
| class UseRefine
| using StringExtensions
|
| p "Hello World".to_snakecase #=> "hello_world"
| end
|
| p "Hello World".to_snakecase
| #=> undefined method `to_snakecase' for "Hello World":String (NoMethodError)

 refineメソッドのブロックで指定したメソッドが引数のString(文字列)に定義されますが、そのメソッドはStringExtensionsモジュールをusingで読み込んだクラスでのみ使用することができます。この例ではto_snakecaseメソッドがUseRefineクラス内で使用できているのですが、UseRefineクラス外ではNoMethodErrorになっているのがわかります。

多少コードも複雑になるので多様されることは非推奨ですが、より安全なプログラムを書く上で役に立つ機能となります。

Module#prepend

 Rubyにはモジュールを使用してクラスの機能を拡張するModule#includeメソッドが用意されています。このincludeメソッドの代替として使用できるのがprependメソッドです。

以下のサンプルコードをご覧ください。

| module M
| end
|
| class A
| include M
| end
|
| class B
| prepend M
| end
|
| p A.ancestors #=> [A, M, Object, Kernel, BasicObject]
| p B.ancestors #=> [M, B, Object, Kernel, BasicObject]

 ancestorsメソッドはメソッドの探索順序を返します。includeを使用したAクラスでは自身のクラスが先頭にあるのでAクラスからメソッドが優先して探索されます。
一方のprependを使用したBクラスでは、Mモジュールが先頭にあります。そのため、メソッドを呼び出した時にモジュール内のメソッドが優先して探索されます。
以前はincludeしかありませんでしたので、モジュール内のメソッドがクラス定義内で上書きされることがありましたが、prependを使用すればモジュール側のメソッドを優先して呼び出すことができます。

以上が新機能の紹介となります。

 CTC教育サービスでは上記2つの資格対策コースを準備しておりますので、受験を希望されている方は今しばらくお待ちください。

■■■ コースの詳細情報 ■■■  ※価格はメルマガ配信時点の価格です。

R002: Ruby入門
期間:2日間
価格:\80,000(税抜)

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes