我想开始在我的一个项目中使用 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
,但鉴于我将参数键入other
为self
,我知道other.value
是 anInteger
并且a <=> b
wherea
和b
are 整数返回一个整数。即我知道它不在nil
这里。
但我怎么知道陡峭呢?nil
我可以以某种方式将此转换为非吗?