【问题标题】:Sorbet: How do i write a generic factory method?Sorbet:我如何编写通用工厂方法?
【发布时间】:2020-09-28 13:17:23
【问题描述】:

我有一个工厂方法,它接收一个类并返回一个实例。在Java中,我可以这样表达:

Java

class InstantiateMe { }

// Generic factory method
class Factory {

  public static <V> V createInstance(Class<V> type) {
    try {
      return type.newInstance();
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

// returns an instance of the class InstantiateMe
Factory.createInstance(InstantiateMe.class);

当尝试在 sorbet 中创建类似的签名时,最终会出错。静态检查器的错误信息:T.class_of needs a Class as its argumentFactory#createInstances 的签名。

红宝石/冰糕:

# typed: true
class InstantiateMe; end

class Factory
  extend T::Sig

  sig do
    type_parameters(:V)
    params(klass: T.class_of(T.type_parameter(:V)))
    .returns(T.type_parameter(:V))
  end
  def self.createInstance(klass)
    klass.new
  end

end

Factory.createInstance(Factory)

在线查询:sorbet.run

我当然明白接受课程的意义。但是,T.type_parameter(:V) 实际上是在表达一个变量类。所以它也应该被接受。与 Java 中接受的方式相同。

但是,也许我只是表达错误。在冰糕中编写通用工厂签名的正确方法是什么?

【问题讨论】:

    标签: ruby static-typing sorbet


    【解决方案1】:

    简短的回答是 Sorbet 目前不支持它。它没有T.instance_of(:X) 的表达式,而T.class_of 不适用于Generic。我们已经在 sorbet slack 中多次提出过这个讨论,但目前实现此类功能并不是他们的首要任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多