你如何在 Sorbet 中键入实例变量缓存?

how do you type instance variable caching in Sorbet?

我有这样的代码 (playground link):

# 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)
            ^^^^^^^^^^

我已经尝试了一些方法来解决这个问题……

我觉得这在 Ruby 中很常见!我怎样才能让 Sorbet 为我进行类型检查?

A​​ Playground Link 马上回给你。

所以,真正使用初始化是这里的重要部分。

  sig { void }
  def initialize
    @expensive = T.let(nil, T.nilable(T::Array[Integer]))
  end

因为在实际调用之前记忆仍然为零,所以你必须允许它为零,以及 T::Array[Integer],然后你需要将它添加到初始化中以进行class 声音。