0

我想开始在我的一个项目中使用 Steep,但我不断收到不知道如何修复的错误。这是从我正在努力解决的代码中提取的一个示例。除了相关位之外,我删除了所有复杂性:

设置

# lib/a/b.rb
module A
  class B
    C = [[''], ['2', '2\''], ['\'', '3', '’']].freeze
    D = (['0'] + C.map(&:first)).freeze

    def initialize(v)
      @v = v
    end

    def <=>(other)
      @v <=> other.v
    end
  end
end

我的签名是这样的:

# sig/a/b.rbs
module A
  class B
    C: ::Array[::Array[::String]]
    D: ::Array[::String]

    @v: ::Integer

    def initialize: (::Integer v) -> untyped

    attr_reader v: ::Integer

    def <=>: (self other) -> ::Integer
  end
end

陡峭的文件:

target :lib do
  signature 'sig'

  check 'lib'
end

陡峭现在说:

lib/a/b.rb:4:4: IncompatibleAssignment: lhs_type=::Array[::String], rhs_type=::Array[(::String | nil)] (D = (['0'] + C.map(&:first)).freeze)
  ::Array[(::String | nil)] <: ::Array[::String]
   (::String | nil) <: ::String
    nil <: ::String
==> nil <: ::String does not hold
lib/a/b.rb:10:4: MethodBodyTypeMismatch: method=<=>, expected=::Integer, actual=(::Integer | nil) (def <=>(other))
  (::Integer | nil) <: ::Integer
   nil <: ::Integer
==> nil <: ::Integer does not hold

问题

我想我理解投诉。通常Array#first返回来自该数组的值或nil. 但是,我的 Array 只是在上面定义了一行,所以我知道它不是nil在这种特殊情况下。

同样的事情<=>。在某些情况下它可能会返回nil,但鉴于我将参数键入otherself,我知道other.value是 anInteger并且a <=> bwhereabare 整数返回一个整数。即我知道它不在nil这里。

但我怎么知道陡峭呢?nil我可以以某种方式将此转换为非吗?

4

0 回答 0