我正在研究ruby koans中的about_classes.rb文件,并用“inside_a_method_self_references_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: Where are the quotes in this return value?,但是他的解决方案(将fido而不是<Dog named 'Fido'>)导致我的rake中止,说堆栈级别太深。
这让我发疯了。我错过了什么?

最佳答案

这不是有效的语法。仅仅因为某些东西在IRB中作为一个特定的东西出现并不意味着它就是字面意义上的东西。inspect方法经常被重写,在本例中,它被重新映射到某个自定义对象。
你想要的是:

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

默认情况下,irb中的任何结果都是通过调用inspect来显示的。

07-25 22:42