Crystal中不使用try方法处理nil解决Gear类编译报错问题
错误原因
你的代码中wheel属性被定义为Wheel?可空类型,直接调用diameter方法不符合Crystal的类型安全要求,因此触发编译报错。
你尝试的条件判断逻辑本身是成立的,但没有生效的核心原因是:getter生成的wheel是实例方法,返回的是实例变量,Crystal编译器不会对实例方法返回的可空值自动做类型缩窄(为了避免多纤程并发场景下,判断后实例变量被其他逻辑修改导致空引用)。
可行解决方案
方案1:赋值给局部变量后判断(最常用)
将实例属性赋值给局部变量后,编译器可以正常识别变量的类型变化,完成类型缩窄:
def gear_inches wheel = self.wheel if wheel ratio * wheel.diameter else 0 end end
方案2:使用类型匹配语句
用case in做显式类型匹配,逻辑更清晰,适合多类型分支的场景:
def gear_inches case wheel in Wheel ratio * wheel.diameter else 0 end end
方案3:从类型定义层面消除空值
如果业务逻辑上Gear实例必须绑定Wheel才能正常工作,可以直接修改初始化参数的类型,去掉可空标记,从根源上避免空值判断:
def initialize(@chainring : Int32, @cog : Int32, @wheel : Wheel) end
调整后原有的gear_inches方法不需要做任何修改即可正常编译运行。
内容的提问来源于stack exchange,提问作者Kohei Yasan
相关产品推荐
相关产品推荐

