尝试注解这段代码时,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
声明变量的类型,但还没有具体说明如何声明。
1条答案
按热度按时间sc4hvdpw1#
Sorbet现在已经内置了对此的支持,从0.5.10210开始。在此之前,还有其他变通方法(见下文)。
1.初始化示例变量为
T.nilable
,并将示例变量在其他地方的所有直接访问替换为方法:→查看sorbet.run
这是首选解决方案。
1.在方法外初始化示例变量,并给予它一个类型注解:
→查看sorbet.run
从概念上讲,这个类有两个执行阶段:当它被初始化时,当它被使用时。如果一个示例变量在Sorbet中初始化时没有给出类型注解,它将到处都是
T.untyped
(或者# typed: strict
中的错误)。因为如果在初始化中没有注解,Sorbet就不知道哪个代码路径会先写入这个位置。(即使在这种情况下,只有一个位置,Sorbet也不会进行那种全局分析。只有当示例变量为nilable时,Sorbet才放松这一点,在这种情况下,它可以在任何地方初始化,因为Sorbet不需要保证它被初始化为非nil。
1.使用不同的严格级别。
Docs on strictness levels。
如果您发现添加类型注解太麻烦,可以使用
# typed: true
来选择不需要类型注解,其中需要示例变量的类型注解的错误被静音。