我有一个方法返回一个对象,该对象可能是许多不同类型的对象之一,但它们都是同一祖先类的一部分。精确的对象类型是动态推断的。
但是,我对签名中返回值的内容感到困惑。我在下面使用了一个占位符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知道它将是一个子类ParentClass
Sorbet 有没有办法指定这一点?我可以用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(使用前将#替换为@)