Ruby:想要将对象用作字符串

时间:2013-06-13 10:07:36

标签: ruby

我正在使用一个使用字符串作为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为字符串的现有代码?

2 个答案:

答案 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