2

我有一个模块要包含在其他类中。它使用Object#class方法,如下所示:(sorbet.run 链接

# typed: true
module M
  def foo
    self.class
  end
end

对此,冰糕说

editor.rb:4: Method class does not exist on M https://srb.help/7003
     4 |    self.class
            ^^^^^^^^^^
  Did you mean to `include Object` in this module?
    ???: Did you mean: Object#class?

现在它变得有趣了。7003 的错误参考确实描述了这可以防止要包含在 BasicObject 中的模块中的类型错误。很好,所以我包括对象,因为检查器告诉我:(sorbet.run 链接

# typed: true
module M
  include Object
  def foo
    self.class
  end
end

该错误消息非常无用,并且链接页面#5032不存在。

editor.rb:2: Only modules can be included. This module or class includes Object https://srb.help/5032
     2 |module M
        ^^^^^^^^

我花了一段时间才意识到它试图告诉我我不能包含一个作为模块子类的类。对比 Ruby 的错误信息:

$ ruby -e 'module M; include Object; end'
Traceback (most recent call last):
        2: from -e:1:in `<main>'
        1: from -e:1:in `<module:M>'
-e:1:in `include': wrong argument type Class (expected Module) (TypeError)

我怎样才能让我的代码在typed: true这里通过关卡?

4

2 回答 2

3

这实际上是两个错误!感谢您指出:

class不在我们的垫片中Kernelhttps ://github.com/sorbet/sorbet/pull/1050 我们不应该建议包含不是的东西Modulehttps ://github.com/sorbet/sorbet/pull /1047

于 2019-06-25T19:49:07.700 回答
0

我目前的解决方法是:(sorbet.run 链接

# typed: true
module ObjectInterface
  def class; super; end
end
module M
  include ObjectInterface
  def foo
    self.class
  end
end
于 2019-06-25T16:57:28.707 回答