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

时间:2019-05-20 15:09:45

标签: crystal-lang

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吗?这是另一个设计限制吗?

1 个答案:

答案 0 :(得分:2)

编译器不知道@foo不变。假设您的class Foo有一个@foo的二传手。如果某些同时运行的代码使用该设置程序将@foo设置为nil,则即使检查之前通过了,if条件中对Foo#foo的第二次调用现在可能返回nil

您可以通过引入编译器可以推断出的局部变量来补救:

if foo = a.foo
  puts foo, typeof(foo)
end