我正在编写一个检查点坐标是否具有特定值的测试,例如:
it "should work" do
p = do_something # returns a Point(x, y)
p.x.should eq 0 # errors (see below)
end
但是它无法编译并出现以下错误:
Error: undefined method 'x' for Nil (compile-time type is (Point | Nil))
我能够将问题简化为以下无法编译的最小示例:
struct Point
property x : Int32
property y : Int32
def initialize(@x, @y)
end
end
begin
p = Point.new 0, 0
ensure
p.x == 0
end
哪个抛出相同的错误:
❯ crystal src/debug.cr
Showing last frame. Use --error-trace for full trace.
In src/debug.cr:11:7
11 | p.x == 0
^
Error: undefined method 'x' for Nil (compile-time type is (Point | Nil))
现在,我遇到了关于编程语言Github跟踪器的类似错误报告:Nil type check fails when using ensure,显然,这是Crystal语言必须解决的问题。
我的问题是,如何在不触发p.x
块中此错误的情况下检查ensure
的值?我对如何访问此方法一无所知。
对于上下文,我正在编写一个对椭圆曲线上的点进行操作的密码库,因此,此处涉及检查坐标的一切。
[p.try &.x == 0
-p
将被检查为Nil
,只有当它不是Nil
时,才进行比较。
p.not_nil!.x == 0
-您命令编译器将p
永远不能是Nil
,但是如果它实际上恰好是nil
,则该行将在运行时上升。