首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Sorbet中键入实例变量缓存?

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

Stack Overflow用户
提问于 2020-10-07 13:00:13
回答 1查看 467关注 0票数 0

我有这样的代码(操场链接 )

代码语言:javascript
复制
# 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

这不符合打字机的要求,说:

代码语言:javascript
复制
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中的一个非常常见的模式!我怎样才能让索布帮我打字呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 13:17:00

一个操场连接回到你身边。

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

代码语言:javascript
复制
  sig { void }
  def initialize
    @expensive = T.let(nil, T.nilable(T::Array[Integer]))
  end

因为回忆录在它真正被调用之前仍然是零,所以您必须允许它与T::Array[Integer]一起为零,然后需要将它添加到初始化中,以使类听起来更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64244536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档