如果指定了类型,则类型缩小不起作用?

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