go cmd/compile: 错误信息,泛型中的< 用法不当,与可比性混淆,

nhhxz33t  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(44)

#63523中提取。编译此程序

package p

func F[T comparable](a, b T) bool {
	return a < b
}

产生

foo.go:4:9: invalid operation: a < b (type parameter T is not comparable with <)

当约束条件为T时,错误信息说“T不可比较”,这有点令人困惑。这不是一个大问题,但我们应该在这里使用更好的措辞。

cqoc49vn

cqoc49vn1#

我认为我们应该提到无效的操作符。例如:

foo.go:4:9: invalid operation: a < b (operator < does not apply to comparable type T)
f5emj3cl

f5emj3cl2#

看起来错误是在src/cmd/compile/internal/types2/expr.go和src/go/types/expr.go中定义的。从快速查看来看,"不可比较"似乎是Go错误的常见短语,尽管我完全同意错误信息可能会有点令人困惑。

kq0g1dla

kq0g1dla3#

我认为我们应该提到无效的操作符。例如:

foo.go:4:9: invalid operation: a < b (operator < does not apply to comparable type T)

为了使错误信息有帮助,它必须引用 cmp.Ordered 。例如:

foo.go:4:9: invalid operation: a < b (type parameter T must satisfy cmp.Ordered interface to be used with <)
foo.go:4:9: invalid operation: a < b (type parameter T must be cmp.Ordered with <)
foo.go:4:9: invalid operation: a < b (type parameter T is missing cmp.Ordered required for <)
foo.go:4:9: invalid operation: a < b (operator < with type parameter T must satisfy cmp.Ordered)
foo.go:4:9: invalid operation: a < b (operator < with type T must be cmp.Ordered)
raogr8fs

raogr8fs4#

为了使错误信息有帮助,它必须引用cmp.Ordered。这里可以是任何类型的操作符,所以不确定是否可行(或值得)报告它。

2ekbmq32

2ekbmq325#

根据规范中提到的可比与有序的区别,用户需要了解的关键区别是:

因此,根据操作符对错误消息中的 comparable 位进行参数化(在第580行)可能就足够了:

cause = check.sprintf("type parameter %s is not %s with %s", errOp.typ, op, verb)

其中,当 opsyntax.Eql, syntax.Neq: 时,verb 可以是 "comparable" ,而如果 opsyntax.Lss, syntax.Leq, syntax.Gtr, syntax.Geq ,则可以是 "orderable"

术语 "orderable" 在这个句子结构中是可以接受的,但缺点是它不够正式(甚至可能不是语法上的英语,不确定)。规范中使用的术语是 "ordered"。因此,另一种选择是允许错误消息有所不同。例如,这样的逻辑:

switch op {
case syntax.Eql, syntax.Neq:
    cause = check.sprintf("type parameter %s is not comparable with %s", errOp.typ, op)

case syntax.Lss, syntax.Leq, syntax.Gtr, syntax.Geq:
    cause = check.sprintf("type parameter %s can not be ordered with %s", errOp.typ, op)
}

相关问题