您将如何用Sorbet做玫瑰回忆?

时间:2019-06-20 20:19:52

标签: ruby sorbet

试图注释此代码,玫瑰备忘录(@||=)给我一个错误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声明变量的类型,但是还没有具体弄清楚如何做。

1 个答案:

答案 0 :(得分:3)

这里有几种解决方案。

  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

→ View on sorbet.run

这是首选解决方案。从概念上讲,该类有两个执行阶段:何时初始化以及何时使用。如果在Sorbet中初始化实例变量时未为其提供类型注释,则它将在所有地方T.untyped(或在# typed: strict中出现错误)。因为如果未在初始化中添加注释,Sorbet将无法知道哪个代码路径可能首先写入此位置。 (即使在这种情况下,只有一个位置,Sorbet也不进行这种全局分析。)

  1. 使用其他严格度级别

Docs on strictness levels

如果发现添加类型注释太麻烦,则可以通过使用# typed: true来选择不要求类型注释,因为对于实例变量,需要类型注释的错误被忽略了。