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吗?这是另一个设计限制吗?
答案 0 :(得分:2)
编译器不知道@foo
不变。假设您的class Foo
有一个@foo
的二传手。如果某些同时运行的代码使用该设置程序将@foo
设置为nil
,则即使检查之前通过了,if条件中对Foo#foo
的第二次调用现在可能返回nil
。
您可以通过引入编译器可以推断出的局部变量来补救:
if foo = a.foo
puts foo, typeof(foo)
end