如果指定了类型,则类型缩小不起作用?
type narrowing not work if type is specified?
class Foo
def initialize(@foo : String | Nil)
end
def foo
@foo
end
end
a = Foo.new "213"
if !a.foo.nil?
puts a.foo, typeof(a.foo)
end
获取
的输出
213
(String | Nil)
但是 a.foo 的类型不应该缩小到 String 吗?这是另一个设计限制吗?
编译器不知道 @foo
没有改变。假设您的 class Foo
有一个 setter 对应 @foo
。如果某些 运行 代码同时使用 setter 将 @foo
设置为 nil
,则在 if 条件内对 Foo#foo
的第二次调用可能 return nil
现在虽然检查通过了。
您可以通过引入编译器可以推理的局部变量来补救:
if foo = a.foo
puts foo, typeof(foo)
end
class Foo
def initialize(@foo : String | Nil)
end
def foo
@foo
end
end
a = Foo.new "213"
if !a.foo.nil?
puts a.foo, typeof(a.foo)
end
获取
的输出213
(String | Nil)
但是 a.foo 的类型不应该缩小到 String 吗?这是另一个设计限制吗?
编译器不知道 @foo
没有改变。假设您的 class Foo
有一个 setter 对应 @foo
。如果某些 运行 代码同时使用 setter 将 @foo
设置为 nil
,则在 if 条件内对 Foo#foo
的第二次调用可能 return nil
现在虽然检查通过了。
您可以通过引入编译器可以推理的局部变量来补救:
if foo = a.foo
puts foo, typeof(foo)
end