ruby 你会怎么做玫瑰回忆与冰糕?

uxhixvfz  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(118)

尝试注解这段代码时,rose memoization(@||=)给出了一个错误Use of undeclared variable @git_sha

# typed: strict
# frozen_string_literal: true

module Util
  extend T::Sig

  sig { returns(String) }
  def self.git_sha
    @git_sha ||= ENV.fetch(
      'GIT_REV',
      `git rev-parse --verify HEAD 2>&1`
    ).chomp
  end
end

据我所知,我应该用T.let声明变量的类型,但还没有具体说明如何声明。

sc4hvdpw

sc4hvdpw1#

Sorbet现在已经内置了对此的支持,从0.5.10210开始。在此之前,还有其他变通方法(见下文)。
1.初始化示例变量为T.nilable,并将示例变量在其他地方的所有直接访问替换为方法:

# typed: strict
# frozen_string_literal: true

module Util
  extend T::Sig

  sig { returns(String) }
  def self.git_sha
    @git_sha ||= T.let(ENV.fetch(
      'GIT_REV',
      `git rev-parse --verify HEAD 2>&1`
    ).chomp, T.nilable(String))
  end
end

→查看sorbet.run
这是首选解决方案。
1.在方法外初始化示例变量,并给予它一个类型注解:

# typed: strict
# frozen_string_literal: true

module Util
  extend T::Sig

  @git_sha = T.let(nil, T.nilable(String))

  sig { returns(String) }
  def self.git_sha
    @git_sha ||= ENV.fetch(
      'GIT_REV',
      `git rev-parse --verify HEAD 2>&1`
    ).chomp
  end
end

→查看sorbet.run
从概念上讲,这个类有两个执行阶段:当它被初始化时,当它被使用时。如果一个示例变量在Sorbet中初始化时没有给出类型注解,它将到处都是T.untyped(或者# typed: strict中的错误)。因为如果在初始化中没有注解,Sorbet就不知道哪个代码路径会先写入这个位置。(即使在这种情况下,只有一个位置,Sorbet也不会进行那种全局分析。
只有当示例变量为nilable时,Sorbet才放松这一点,在这种情况下,它可以在任何地方初始化,因为Sorbet不需要保证它被初始化为非nil。
1.使用不同的严格级别
Docs on strictness levels
如果您发现添加类型注解太麻烦,可以使用# typed: true来选择不需要类型注解,其中需要示例变量的类型注解的错误被静音。

相关问题