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


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类型缩小到字符串吗?这是另一个设计限制吗?

编译器不知道@foo不会更改。假设您的class Foo有一个用于@foo的设置器。如果某些同时运行的代码使用该设置器将@foo设置为nil,则即使在过去之前的支票也可能返回Foo#foo的第二个调用CC_6。

您可以通过引入局部变量来进行补救,该变量可以:

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

最新更新