"concept" 定义带有参数的方法时程序无法编译
Program doesn't compile when "concept" defines a method with a parameter
我有一个 concept
这样的:
type Foo = concept x, y
x.test(y) is bool
然后是一个类型,它试图定义一个实现 concept
:
的方法
type Bar = object
s: string
proc test(x: Bar, y: string): bool =
x.s == y
还有一个具有通用字段 T: Foo
的类型,其构造函数接收 T: Foo
:
type Baz[T: Foo] = object
f: T
proc make[T: Foo](f: T): auto =
result = Baz[T](f: f)
当我创建一个新的 Bar
并将其传递给 make
过程以创建一个新的 Baz
时,它没有编译:
let bar = Bar(s: "whatever")
let made = make[Bar](bar)
Error: type mismatch: got (Bar) but expected 'T'
但是,如果我在概念中删除 y
,它会编译,例如 x.test is bool
并相应地更新 test
proc。
我做错了什么?
改变
type Foo = concept x, y
x.test(y) is bool
到
type Foo = concept x
x.test(string) is bool
在你的代码中,这意味着 x 和 y 都是 Foo 类型。如果你真的是那个意思,请试试这个。
proc test(x: Bar, y: Bar): bool =
x.s == y.s
我有一个 concept
这样的:
type Foo = concept x, y
x.test(y) is bool
然后是一个类型,它试图定义一个实现 concept
:
type Bar = object
s: string
proc test(x: Bar, y: string): bool =
x.s == y
还有一个具有通用字段 T: Foo
的类型,其构造函数接收 T: Foo
:
type Baz[T: Foo] = object
f: T
proc make[T: Foo](f: T): auto =
result = Baz[T](f: f)
当我创建一个新的 Bar
并将其传递给 make
过程以创建一个新的 Baz
时,它没有编译:
let bar = Bar(s: "whatever")
let made = make[Bar](bar)
Error: type mismatch: got (Bar) but expected 'T'
但是,如果我在概念中删除 y
,它会编译,例如 x.test is bool
并相应地更新 test
proc。
我做错了什么?
改变
type Foo = concept x, y
x.test(y) is bool
到
type Foo = concept x
x.test(string) is bool
在你的代码中,这意味着 x 和 y 都是 Foo 类型。如果你真的是那个意思,请试试这个。
proc test(x: Bar, y: Bar): bool =
x.s == y.s