标题描述不太严谨,我是想表达这个:
以前Haskell
的data
的值构造器很自然地是个函数。今天看某库的代码发现Option
的map
竟然传一个struct
名进来,就跟Haskell
中的data
作为函数用法就很像了。
但是我有一疑问请问一下各位高手:这一行为是定义在哪里的呢?FnOnce
的文档也没看到相关内容。
示例代码:
#[derive(PartialEq, Debug)]
struct D(i32);
fn main() {
let d = Some(233i32).map(D);
assert_eq!(Some(D(233i32)), d);
}
Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5b38108c4c0a823a7364cedd827d13e8
1
共 3 条评论, 1 页
评论区
写评论看来还是我看书不认真……感谢各位的回答! 对以下内容的回复:
这里好像讲了:https://doc.rust-lang.org/stable/reference/types/function-item.html
这里讲了,每个函数,以及 tuple-like struct 和 enum 的构造器,都对应一个 function item type;这些类型和闭包的类型一样,都是无法写出来的;它们都实现了 Fn, FnMut, FnOnce, Copy, Clone, Send, Sync 这些 trait。
你发现了编译器中的一个彩蛋,实际实现确实是这样的。一个函数构造器。