Rubyのrefinements機能の使い方


こんにちは。Tomoyuki(@tomoyuki65)です。

Rubyでプログラミングをしている際に、例えばStringクラスなどRuby標準のライブラリに独自の変更を加えたいという時もあるかもしれませんよね。

 

でも、広範囲に使われるクラスを独自に変更するのは、予期せぬ不具合に遭遇するリスクが高まります。

 

そんな時は、Ruby 2.0から導入されたrefinements機能が便利なんです。

この記事では、そんなrefinements機能について解説します。

 



refinements機能とは?

Rubyはオープンクラスなので、既存のクラスを再定義したり、機能を追加することが可能です。

この手法はモンキーパッチと呼び、変更のスコープはグローバルです。そのためモンキーパッチのあたったクラスのユーザー全てに影響が生じます。

refinements機能は、モンキーパッチがクラスに利用者に与える影響を軽減するために設計され、クラスの拡張をローカルにとどめるための手段です。

 

refinements機能の使い方

refinements機能の使い方について説明します。

例えば、Stringクラスに文字列の最初の一文字目の文字を返す「first_letter」メソッドを追加してみます。

 

まずは、Stringクラスには「first_letter」メソッドが無いことを確認してみます。

# Stringクラスにfirst_letterメソッドが無いことを確認
puts 'Tanaka'.first_letter

 

実行結果
Main.rb:2:in `': undefined method `first_letter' for "Tanaka":String (NoMethodError)

 

実行結果の通り、Stringクラスに「first_letter」メソッドが無いことを確認できました。

では、refinements機能を使うため、モジュールを作成して「first_letter」メソッドを定義します。

# モジュールを作成し、「first_letter」メソッドを定義
module FirstLetter
# refineメソッドで、Stringクラスを指定する
refine String do
# first_letterメソッドを定義
def first_letter
slice(0, 1)
end
end
end

 

作成したモジュールを、定義したUserクラスの内部で使用してみます。

では、以下のプログラムを実行してみて下さい。

# モジュールを作成し、「first_letter」メソッドを定義
module FirstLetter
# refineメソッドで、Stringクラスを指定する
refine String do
# first_letterメソッドを定義
def first_letter
slice(0, 1)
end
end
end
# Userクラスを定義
class User
# refinements機能を有効にするためには、usingメソッドを使います。
using FirstLetter
def initialize(name)
@name = name
end
# first_letterメソッドを使い、名前の一文字目を返すメソッドを定義
def first_letter_name
@name.first_letter
end
end
user = User.new('Tanaka')
# first_letter_nameメソッドを実行して表示
puts user.first_letter_name

 

実行結果
T

 

実行結果の通り、refinements機能を使うことで、Userクラスの内部でのみStringクラスの「first_letter」メソッドが使用できました。

 

モンキーパッチをあてる必要がある場合は、refiments機能が利用できないか思い出すと良いでしょう。

 

まとめ

  •  refinements機能は、モンキーパッチがクラスに利用者に与える影響を軽減するために設計され、クラスの拡張をローカルにとどめるための手段
  •  モジュールにrefineメソッドでクラスを指定し、追加したいメソッドを定義
  •  refinements機能を使用する場合は、usingメソッドでモジュールを指定

 

 

  • 関連記事

オススメのRuby入門サイトはどれ?Rubyの学習方法をまとめる

2017.10.24

 

The following two tabs change content below.
Tomoyuki

Tomoyuki

元SEでリスクを取って勢いで会社を辞め、人生をコンテンツにしてみたプロブロガー1年目です。私にしか書けない記事で、様々な価値を提供します!









人生をコンテンツにしたブログ

ブロガー人生の結果を、このブログで示します。



ビットコインを買うならZaif取引所がおすすめ!

Zaif取引所は他の主要取引所と比べて手数料が安いのが特徴。
ビットコインの他、イーサリアム、モナーコイン、ネムも購入可能です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です