Rust 运算符重载六件趣事

原文: Six fun things to do with Rust operator overloading | Wisha Wanichwecharungruang

dot-product-pooh

快译

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;
}

(是也乎:

这是从形式上和语义同步了. )

refer.

关键参考

logging

版本记要

  • 230212 ZQ v1 done
  • 230125 ZQ init.
           _~^&-~_
       \) /  * ?  \ (/
         '_   ⩌   _'
         ( '--~--' \

...act by ferris-actor v0.2.4 (built on 23.0303.201916)

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可;-)