3

全体で文字列を ID として使用するライブラリを使用しています。これらの ID の代わりに使用できるクラスを作成したいのですが、既存のコードでは文字列のように見えます。たとえば、次のような既存のテストがあります。

require 'test/unit'
class IdString < Hash
  def initialize(id)
    @id = id
  end

  def to_s
    @id
  end
end

class TestGet < Test::Unit::TestCase
  def test_that_id_is_1234
    id = IdString.new('1234')

    assert_match(/1234/, id)
  end
end

残念ながら、これは失敗します:

TypeError: can't convert IdString to String

ID が文字列であることを期待するすべての既存のコードを変更せずにこれを修正する方法はありますか?

4

2 に答える 2

7

to_str暗黙的な変換に使用されるメソッドを実装する必要があります。

def to_str
  @id
end
于 2013-06-13T10:12:00.477 に答える
0

から継承しているため、問題が発生していますHash。本当に求めているのが文字列である場合、なぜこれが必要なのですか?

ID を別のオブジェクトにカプセル化したい場合 (これについてはよく考える必要があります)、次のようにします。

require 'test/unit'

class IdString < Hash
  def initialize(id)
    @id = id
  end

  def to_str
    @id
  end
end

class TestGet < Test::Unit::TestCase
  def test_that_id_is_1234
    id = IdString.new('1234')

    assert_match(/1234/, id)
  end
end
于 2013-06-13T10:15:13.597 に答える