我正在使用一个使用字符串作为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为字符串的现有代码?
答案 0 :(得分:7)
您应该实现to_str
方法,该方法用于隐式转换:
def to_str
@id
end
答案 1 :(得分: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