在 sorbet 中,你能指定一个类型是一个类的后代吗?

2024-05-03

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

但是,我对签名中返回值的内容感到困惑。我在下面使用了一个占位符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

鉴于我不知道将返回哪个精确的类(并且我不想明确列出它们),但我do知道它将是一个子类ParentClassSorbet 有没有办法指定这一点?我可以用T.untyped但它是不必要的松动。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 sorbet 中,你能指定一个类型是一个类的后代吗? 的相关文章

随机推荐