Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Collecting Inputs | Use built-in conversion protocols

概要

Use built-in conversion protocols

前提

Confident Rubyではメソッド内の処理を次のように分類しています。
・Collecting Inputs(引数チェック、変換など)
・Performing Work(主処理)
・Delivering Output(戻り値に関わる処理)
・Handling Failure(例外処理)

当記事は上記のうち、Collecting Inputsに関する話です。

詳細

状況

coreな型を利用した入力を確認したい。
例えばStringの入力を期待するメソッドを書く場合。

概要

Rubyの変換手続きを利用する。to_str,to_path.to_aryなど。

理由

提供するメソッドが受け入れることのできる入力の型をよりフレキシブルにする。

サンプルコード仕様

文字列に「だぜ!」を追加して標準出力する。

クラス固定でチェックした場合のサンプルコード

Stringクラスでチェックすると、Stringクラスでしか利用できません。

class Mrだぜ
  def だぜ(text)
    fail TypeError , "不正なデータ型 #{text.class}" unless text.is_a? String
    print "#{text}だぜ!"
  end
end

Mrだぜ.new.だぜ("田中")

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name, @age = name, age
  end
end
tanaka = Person.new("tanaka", 43)

# TypeErrorが発生
# Mrだぜ.new.だぜ(tanaka)

出力

田中だぜ!

ビルトインの変換メソッドでチェックした場合のサンプルコード

変換メソッドのto_strを利用することで、to_strさえ実装していれば
「だぜ」メソッドを利用できます。

class Mrだぜ
  def だぜ(text)
    text = text.to_str
    puts "#{text}だぜ!"
  end
end

Mrだぜ.new.だぜ("田中")

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name, @age = name, age
  end

  def to_str
    @name
  end
end

tanaka = Person.new("tanaka", 43)

Mrだぜ.new.だぜ(tanaka)