gpt4 book ai didi

sorbet - 混淆何时使用 T.let 与 T.cast

转载 作者:行者123 更新时间:2023-12-05 05:49:10 25 4
gpt4 key购买 nike

基于:https://sorbet.org/docs/type-assertions

在我看来,T.cast 似乎是 T.let 的更强大版本。 T.cast(expr, type) 强制 Sorbet 接受 expr 作为 type,即使 expr 不能是静态的已验证为 typeT.let(expr, type) 向 Sorbet 提示 expr 具有 type,并且 Sorbet 将能够类型检查该提示是否有效。基于这种理解,我会假设 T.cast 总是可以用来代替 T.let,但是 T.let 是首选因为 Sorbet 提供了最多的类型安全性。但是,我最近发现了一个不正确的案例(见下文)。

此示例基于:https://sorbet.org/docs/error-reference#7001

# typed: true

class Main
extend T::Sig

sig { params(elem: Integer).returns(T::Boolean) }
def valid?(elem)
elem == 0
end

sig { params(list: T::Array[Integer]).returns(T::Boolean) }
def works(list)
# Declare `all_valid` with type `T::Boolean`
all_valid = T.let(false, T::Boolean)

list.each do |elem|
# Does not change the type of `all_valid`
all_valid &&= valid?(elem) # ok
end

all_valid
end

sig { params(list: T::Array[Integer]).returns(T::Boolean) }
def does_not_work(list)
all_valid = T.cast(false, T::Boolean)

list.each do |elem|
# ERROR! Changing the type of a variable in a loop is not permitted
all_valid &&= valid?(elem)
end

all_valid
end
end

为什么这适用于 T.let 但不适用于 T.cast

最佳答案

T.let 注释显式地将类型从 FalseClass 扩展为 T:Boolean

T.cast 另一方面只是放宽了 Sorbet 的静态检查,它不会在运行时消除处理 TrueClassFalseClass< 时发生的类型错误 作为 T::Boolean

关于sorbet - 混淆何时使用 T.let 与 T.cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70698561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com