我得到
undefined method 'start_time' for Nil (compile-time type is (Reservation | Nil))
代码
if game.reservation && other_game.reservation
if(game.reservation.start_time == other_game.reservation.start_time)
return false
end
end
,但是如果我这样做
reservation : Reservation | Nil = game.reservation
other_reservation : Reservation | Nil = other_game.reservation
if reservation && other_reservation
if(reservation.start_time == other_reservation.start_time)
return false
end
end
为什么这些表达式不等同?通常,IF是一种类型过滤器,可从类型中删除Nil
联合,而不是当它是嵌套对象时。第二种方法有效,但感觉不必要地冗长。
使用嵌套对象上的if执行类型过滤器的正确方法是什么?
让我们简化一点(仍然是同一错误(:
if game.reservation
game.reservation.starting_time
end
条件可确保game.reservation
的返回值不是nil
。此表达式只是调用game
上的方法reservation
。之后返回的值未重复使用,也无法知道第二个调用该方法是否可能返回nil
。
您可以通过将返回值存储在本地变量中来轻松解决。这样,编译器可以确保其值不是nil
。这是更大的性能,因为它可以节省一个(可能昂贵的(附加调用。
if reservation = game.reservation
reservation.starting_time
end
语言参考中更详细地说明了确切的行为:https://crystal-lang.org/docs/syntax_and_and_semantics/if_var.html