Rust 运算符重载六件趣事
原文: Six fun things to do with Rust operator overloading | Wisha Wanichwecharungruang
快译
C++ 输入/出
想替代:
#![allow(unused)] fn main() { stdin().read_line(&mut buffer).unwrap(); println!("Hello I am {name}!!!"); }
可以重载 cin 和 count 上的移位运算符来达成:
#![allow(unused)] fn main() { cin >> &mut buffer; cout << "Hello I am " << name << "!!!" << endl; }
(是也乎:
看起来意义更加不明了了? )
可变函数
想替代
#![allow(unused)] fn main() { std::cmp::max(x, y); [w, x, y, z].into_iter().max(); }
可以搞成:
#![allow(unused)] fn main() { // max+ is like std::cmp::max but better // it supports >2 arguments max+(x, y); max+(w, x, y, z); }
(是也乎:
内置标准库太丰富了...简直必须要有一个信仰过程
)
更简洁的构建器
这是一个更严重的问题; 构建器模式有时涉及大量重复的方法调用; 以 warp web 框架的这种用法为例:
#![allow(unused)] fn main() { let hi = warp::path("hello") .and(warp::path::param()) .and(warp::header("user-agent")) .map(|param: String, agent: String| { format!("Hello {}, whose agent is {}", param, agent) }); }
如果 API 看起来像这样呢?
#![allow(unused)] fn main() { let hi = warp::path("hello") + warp::path::param() + warp::header("user-agent") >> |param: String, agent: String| { format!("Hello {}, whose agent is {}", param, agent) }; }
(是也乎:
等等, 这就是语法糖了吧? )
中缀函数
想替代:
#![allow(unused)] fn main() { x.pow(y); dot_product(a, b); a.cross(b.cross(c).cross(d)) }
我们可以这么来:
#![allow(unused)] fn main() { x ^pow^ y; a *dot* b; a *cross* (b *cross* c *cross* d); }
很多人就想要这个!
(是也乎:
嗯哼? 的确流畅很多哪... )
Doublefish
std::mem 提供有这些功能:
#![allow(unused)] fn main() { size_of::<T>(); size_of_val(&value); }
Turbofish 爱好者会喜欢 size_of, 但是对 size_of_val 没什么感觉; 所以, 我们可以自行改造出新版本的 size_of_val , 看起来更象 turbofishy:
#![allow(unused)] fn main() { size_of::<T>(); size_of_val<<&value>>(); }
Join 和 Race
特性组合器可能具有短路行为能力;
#![allow(unused)] fn main() { // quit if any of the 3 errors (fut1, fut2, fut3).try_join().await; // quit if any of the 3 succeeds (fut4, fut5, fut6).race_ok().await; }
可以通过 & 和 | 在形式上表达出这点:
#![allow(unused)] fn main() { (TryJoin >> fut1 & fut2 & fut3).await; (RaceOk >> fut4 | fut5 | fut6).await; }
(是也乎
:
这是从形式上和语义同步了. )
Useful Links
- Discuss this on Reddit
- Playground containing the implementations behind some of the code shown here
- std::ops docs
- Rust operators precedence table
refer.
关键参考
logging
版本记要
- 230212 ZQ v1 done
- 230125 ZQ init.
_~^&-~_
\) / * ? \ (/
'_ ⩌ _'
( '--~--' \
...act by ferris-actor v0.2.4 (built on 23.0303.201916)