试图注释此代码,玫瑰备忘录(@||=
)给我一个错误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
声明变量的类型,但是还没有具体弄清楚如何做。
答案 0 :(得分:3)
这里有几种解决方案。
# 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中初始化实例变量时未为其提供类型注释,则它将在所有地方T.untyped
(或在# typed: strict
中出现错误)。因为如果未在初始化中添加注释,Sorbet将无法知道哪个代码路径可能首先写入此位置。 (即使在这种情况下,只有一个位置,Sorbet也不进行这种全局分析。)
如果发现添加类型注释太麻烦,则可以通过使用# typed: true
来选择不要求类型注释,因为对于实例变量,需要类型注释的错误被忽略了。