【问题标题】:Sorbet signature for a function with class argument?带有类参数的函数的冰糕签名?
【发布时间】:2019-08-02 19:09:11
【问题描述】:

如何为下面的archive_all函数写签名?

sorbet.run

# typed: true
extend T::Sig

module Archivable
  def archive
  end
end
class Book
  extend Archivable
end
class Magazine
  extend Archivable
end

sig {params(klass: T.class_of(Archivable)).void}
def archive_all(klass)
  klass.archive
end

archive_all(Book) 
archive_all(Magazine)

冰糕错误:

editor.rb:17: Method archive does not exist on T.class_of(Archivable) https://srb.help/7003
    17 |  klass.archive
          ^^^^^^^^^^^^^
    editor.rb:5: Did you mean: Archivable#archive?
     5 |  def archive
          ^^^^^^^^^^^

【问题讨论】:

  • 除非我严重误解了 Sorbet 的工作原理,否则我会假定 class_of(Archivable) 是 Module,而且并非所有 Module 的实例都有一个名为 archive 的方法。

标签: ruby sorbet


【解决方案1】:

您希望能够传递Archivable 的任何实例。正确的做法是使用名为class type 的 Sorbet 功能:

sig {params(klass: Archivable).void}

Observe.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2021-05-15
    • 2019-11-10
    相关资源
    最近更新 更多