gpt4 book ai didi

functional-programming - 如何声明遵循函数类型的常规(非闭包)函数?

转载 作者:行者123 更新时间:2023-11-29 08:12:00 24 4
gpt4 key购买 nike

我有一组具有共同签名的不同排序函数,因此它们可以互换地传递给其他函数。我希望能够内联声明每个签名都应匹配相同的签名,因此如果其中一个与签名不符,我会根据上下文收到警告。

Rust 有声明函数类型的语法:

type Foo = Fn(i32) -> i32;

fn bar(func: &Foo) {
func(12);
}

我想不通的是如何声明一个遵循函数类型的常规(非闭包)函数:

// this works and can be passed as a Foo, but 
// duplicates code and isn't checked against Foo
fn blah(x: i32) -> i32 {
return x * 2;
}

// this isn't valid syntax
fn blah(x): Foo {
return x * 2;
}

这是其他一些具有函数类型的语言的常见做法。是否有我不知道的语法,这是即将推出的功能,还是有一些技术原因阻止它被添加到 Rust 中?

注意;像这样的东西也符合我的目的,尽管它会更笨重:

fn blah(x: i32) -> i32 {
return x * 2;
}: Foo

最佳答案

Rust has a syntax for declaring function types:

type Foo = Fn(i32) -> i32;

不是这样的语法(因为您可能会推断它没有按照您的意愿行事)。这将创建类型为 dyn Fn(i32) -> i32 的类型别名。

您可以通过使用函数指针并创建一个未使用的变量集来实现您想要的一些功能:

type MyType = fn(i32) -> i32;

fn blah(x: i32) -> i32 {
x * 2
}

const _IGNORE: MyType = blah;

但是,我同意您以非惯用的 Rust 方式处理此问题的评论。你想创建一个事物遵循的接口(interface),在 Rust 中这是一个 trait :

trait Sort {
fn foo(_: i32) -> i32;
}

struct A;
impl Sort for A {
fn foo(x: i32) -> i32 {
x * 2
}
}

这可以通过提供 fn(String) 来防止意外“交叉流”,而您的意思是 fn(String);前者是“打印这个字符串”,后者是“删除指定的文件”。函数签名充其量只是一个弱接口(interface)。

另见:

关于functional-programming - 如何声明遵循函数类型的常规(非闭包)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56658729/

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