1

我有一个方法返回一个对象,该对象可能是许多不同类型的对象之一,但它们都是同一个祖先类的一部分。精确的对象类型是动态推断的。

但是,我对在签名中为返回值添加什么感到困惑。我在下面放置了一个占位符instance_of来说明问题:

sig{params(instance_class: String).returns(instance_of ParentClass)}
def build_instance instance_class
  klass = Object.const_get(instance_class)
  return klass.new
end

鉴于我不知道将返回哪个精确的类(而且我不想明确列出它们),但我知道它将ParentClass是 Sorbet 中是否有办法指定它的子类?我可以使用T.untyped,但它不必要地松动。

4

1 回答 1

1

通过反复试验,我发现如果我理解正确,检查对象是否包含其祖先中的类型是冰糕的默认行为。

Sorbet 不会检查对象是否与指定的类型精确匹配,只会检查它是否在其祖先中包含该类型(也许这就是类型检查的一般含义,但我对游戏相当陌生)。

为了避免以下错误:

Returning value that does not conform to method result type https://srb.help/7005

您还需要T.cast()返回到的对象ParentClass

sig{params(instance_class: String).returns(ParentClass)}
def build_instance instance_class
  klass = Object.const_get(instance_class)
  # NB instance is a descendent of ParentClass, not an instance...
  return T.cast(klass.new, ParentClass)
end

这似乎可行,但我很想知道这是否是解决问题的正确方法。

于 2020-07-22T12:13:39.643 回答