3

我正在研究 Ruby Koans 中的 about_classes.rb 文件,并且通过“inside_a_method_self_refers_to_the_containing_object”测试遇到了障碍。这是代码:

class Dog7
  attr_reader :name

  def initialize(initial_name)
    @name = initial_name
  end

  def get_self
    self
  end

  def to_s
    __
  end

  def inspect
    "<Dog named '#{name}'>"
  end
end

def test_inside_a_method_self_refers_to_the_containing_object
  fido = Dog7.new("Fido")

  fidos_self = fido.get_self
  assert_equal <Dog named 'Fido'>, fidos_self
end

所以,我试图将assert_equal评估的前半部分变为后半部分(fidos_self)。当我在 irb 中解决时,fidos_self 返回<Dog named 'Fido'>,但我不断收到该答案的语法错误。

我看过类似的帖子: Ruby Koans:此返回值中的引号在哪里?,但他的解决方案(fido而不是<Dog named 'Fido'>)导致我的 rake 中止,说堆栈级别太深。

这让我发疯了。我在这里想念什么?

4

1 回答 1

4

那不是有效的语法。仅仅因为某些东西在 IRB 中显示为特定的东西并不意味着它就是字面意思。该inspect方法经常被覆盖,在这种情况下,它被重新映射到自定义的东西。

你想要的是:

assert_equal "<Dog named 'Fido'>", fidos_self.inspect

默认情况下,任何结果irb都通过调用来呈现inspect

于 2012-10-12T15:35:07.657 回答