我有这样的代码(操场链接 )
# typed: strict
class A
extend T::Sig
sig { returns(T::Array[Integer]) }
def compute_expensive
[1, 2, 3]
end
sig { returns(T::Array[Integer]) }
def expensive
@expensive ||= T.let(compute_expensive, T::Array[Integer])
end
end这不符合打字机的要求,说:
editor.rb:12: The instance variable @expensive must be declared inside initialize or declared nilable https://srb.help/5005
12 | @expensive ||= T.let(compute_expensive, Integer)
^^^^^^^^^^我试过几件事来避开这个…
T.nilable(Integer)时,Sorbet说返回类型与sig不匹配。很公平。initialize中声明类型为@expensive = nil时,Sorbet说nil不使用下面的Integer定义键入check。也很公平。initialize中声明了initialize,那么我与||=的分配就无法实现。@expensive = compute_expensive if @expensive.empty?,然后返回@expensive,但我更感兴趣的是Sorbet的类型系统如何适应||=模式。在我看来,这是Ruby中的一个非常常见的模式!我怎样才能让索布帮我打字呢?
发布于 2020-10-07 13:17:00
一个操场连接回到你身边。
所以,真正使用初始化是这里的重要部分。
sig { void }
def initialize
@expensive = T.let(nil, T.nilable(T::Array[Integer]))
end因为回忆录在它真正被调用之前仍然是零,所以您必须允许它与T::Array[Integer]一起为零,然后需要将它添加到初始化中,以使类听起来更好。
https://stackoverflow.com/questions/64244536
复制相似问题