< 返回版块

Nalleyer 发表于 2019-12-28 20:54

标题描述不太严谨,我是想表达这个: 以前Haskelldata的值构造器很自然地是个函数。今天看某库的代码发现Optionmap竟然传一个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

评论区

写评论
作者 Nalleyer 2019-12-30 10:26

看来还是我看书不认真……感谢各位的回答! 对以下内容的回复:

AlephAlpha 2019-12-29 10:57

这里好像讲了: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。

Mike Tang 2019-12-28 21:33

你发现了编译器中的一个彩蛋,实际实现确实是这样的。一个函数构造器。

1 共 3 条评论, 1 页