嵌套水晶对象上的空型过滤



我得到

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

相关内容

  • 没有找到相关文章

最新更新