错误:Nil的未定义方法'x'(编译时类型为(Point | Nil))

问题描述 投票:1回答:1

我正在编写一个检查点坐标是否具有特定值的测试,例如:

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的值?我对如何访问此方法一无所知。

对于上下文,我正在编写一个对椭圆曲线上的点进行操作的密码库,因此,此处涉及检查坐标的一切。

unit-testing compiler-errors crystal-lang
1个回答
1
投票

[p.try &.x == 0-p将被检查为Nil,只有当它不是Nil时,才进行比较。

    [p.not_nil!.x == 0-您命令编译器将p永远不能是Nil,但是如果它实际上恰好是nil,则该行将在运行时上升。
© www.soinside.com 2019 - 2024. All rights reserved.