functional-programming - 如何声明一个符合函数类型的常规(非闭包)函数?
问题描述
我有一组具有共同签名的不同排序函数,因此它们可以互换地传递给其他函数。我希望能够内联声明每个都应该匹配相同的签名,所以如果其中一个与它中断,我会在上下文中得到警告。
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 有一个声明函数类型的语法:
type Foo = Fn(i32) -> i32;
这不是这样的语法(正如您可能通过它不做您想要的事实来推断的那样)。这将创建 type 的类型别名dyn Fn(i32) -> i32
。
您可以通过使用函数指针并为函数创建一个未使用的变量集来实现您想要的一些功能:
type MyType = fn(i32) -> i32;
fn blah(x: i32) -> i32 {
x * 2
}
const _IGNORE: MyType = blah;
但是,我同意您以非惯用的 Rust 方式处理此问题的评论。你想创建一个东西遵守的接口,在 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)
;时提供 a 来防止意外地“跨越溪流” 前者是“打印此字符串”,后者是“删除命名的文件”。函数签名充其量只是一个弱接口。
也可以看看:
推荐阅读
- javascript - jQuery:通过返回 jQuery.fn.init(9) 的类选择元素 - 无法读取 .val()
- pandas - 如何使用对另一列值的测试来填充 pandas 数据框列?
- python - 将许多熊猫数据框分配给变量
- javascript - 从 Javascript 将 CSS 属性分配给 HTML 元素的问题
- javascript - 无法在过滤器功能中使用订阅输出值
- batch-file - 写入以 USC-2 LE BOM 编码的文件,批处理脚本
- python - 为python 2.7 windows 10安装pip命令时出现属性错误
- angular - 我应该遵循数据库实体以角度创建模型吗?
- amazon-dynamodb - 如何在单个 QueryResultPage 中从 DynamoDb 中的多个分区获取结果
- linux - 二进制数如何表示为字符