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入門サイトおすすめ3選!初心者向けの学習方法を解説

2017年10月24日

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


おすすめのゲーミングPCまとめ

近年、eスポーツという言葉が浸透し、ゲーミングPCの需要も増えましたが、「ゲーミングPCはどう選べばいいの?」という人も多いのではないでしょうか。そんなPC初心者でも迷わず選べるよう、おすすめのゲーミングPCをご紹介します!


コメントを残す

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