gpt4 book ai didi

去泛型 : infer type parameter for variadic function with zero arguments

转载 作者:行者123 更新时间:2023-12-05 03:17:06 25 4
gpt4 key购买 nike

假设我有一个带有两个通用参数的函数,其中一个是可变参数:

func Constructor[F any, Opt any](f F, opts ...Opt) {}

如果我传入几个选项​​,调用这个函数就可以正常工作:

Constructor(func() *myService { return ... }, 1, 2, 3)

但是,在没有任何 Opt 的情况下调用它会失败:

Construtor(func() *myService { return ... })

编译器提示:

Cannot use 'func() *myService' (type func() *myService) as the type (F, Opt) or F

我认为这是因为在这种情况下编译器无法确定 Opt 的类型。

虽然这是有道理的,但还是很烦人。编译器不需要 Opt 的类型,因为它是空的。

解决此问题的一种方法是定义两个函数,ConstructorConstructorWithOpts。不过,如果只有一个功能就好了。有什么想法吗?

最佳答案

The compiler doesn't need the type of Opt, since it's empty.

即使调用者 决定提供零参数,函数体仍然可以使用可变参数的值进行操作。所以编译器肯定需要Opt的类型。

此外还有 type inference 的规则很清楚:

Type inference is based on

  • a type parameter list
  • a substitution map M initialized with the knowntype arguments, if any
  • a (possibly empty) list of ordinary functionarguments (in case of a function call only)

当某个类型参数的参数为​​零时,上面的第三个选项不适用。如果FOpt完全无关,则第二个选项也不适用。

作为推论,如果调用者需要声明您的 Constructor 函数类型的 value,请考虑调用者必须提供所有类型参数:

ctor := Constructor[func(), any] // not called!
ctor(f, 1, 2, 3)

最干净的显然是让编译器推断F并显式指定Opts,尽管这需要反转函数声明中类型参数的顺序,以便客户可以提供第一个并省略第二个。你可以定义一个 any 类型来提高可读性:

func Constructor[Opt any, F any](f F, opts ...Opt) {}

type NoOpts any // just for better readability

func main() {
f := func() *myService { return ... }

// NoOpts instantiates Opt; F inferred
Constructor[NoOpts](f)
}

否则只需使 Constructor 成为非可变参数:

func Constructor[F any](f F) {
ConstructorWithOpts[F, any](f)
}

func ConstructorWithOpts[F any, Opt any](f F, opts ...Opt) {
// ...
}

关于去泛型 : infer type parameter for variadic function with zero arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74327597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com