こんにちは。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
実行結果の通り、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
実行結果の通り、refinements機能を使うことで、Userクラスの内部でのみStringクラスの「first_letter」メソッドが使用できました。
モンキーパッチをあてる必要がある場合は、refiments機能が利用できないか思い出すと良いでしょう。
まとめ
- refinements機能は、モンキーパッチがクラスに利用者に与える影響を軽減するために設計され、クラスの拡張をローカルにとどめるための手段
- モジュールにrefineメソッドでクラスを指定し、追加したいメソッドを定義
- refinements機能を使用する場合は、usingメソッドでモジュールを指定
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- Go言語(Golang)専門の技術ブログ「Golang-Tech」を開設!? - 2024年9月26日
- 【2024年】モンハンワイルズの推奨スペックとおすすめのゲーミングPCを紹介! - 2024年9月26日
- 37歳Web系エンジニア3年目。生成AI(ChatGPT・Gemini)現る。 - 2024年7月3日
コメントを残す