是否可以为 apply::Apply 实现运算符重载?
Posted
技术标签:
【中文标题】是否可以为 apply::Apply 实现运算符重载?【英文标题】:Is it possible to implement operator overloading for apply::Apply? 【发布时间】:2022-01-12 21:03:31 【问题描述】:有没有办法为apply::Apply
实现operator overloading?
在 Rust 中,许多运算符可以通过特征重载。也就是说,一些运算符可用于根据其输入参数完成不同的任务。这是可能的,因为运算符是方法调用的语法糖。例如,a + b 中的 + 运算符调用 add 方法(如在 a.add(b) 中)。这个 add 方法是 Add trait 的一部分。因此,任何 Add trait 的实现者都可以使用 + 运算符。
/// Represents a type which can have functions applied to it (implemented
/// by default for all types).
pub trait Apply<Res>
/// Apply a function which takes the parameter by value.
fn apply<F: FnOnce(Self) -> Res>(self, f: F) -> Res
where Self: Sized
f(self)
impl<T: ?Sized, Res> Apply<Res> for T
// use default definitions...
Crate overload
例如,
let string = 1 >> (|x| x * 2) >> (|x: i32| x.to_string());
为
let string = 1.apply(|x| x * 2).apply(|x: i32| x.to_string());
【问题讨论】:
“实现运算符重载”是什么意思?您始终可以在std::ops
中实现特征。
我想我的问题说清楚了,术语来自官方文档。
【参考方案1】:
不是真的。运算符不继续特征,他们继续类型。问“Apply
的>>
的实现是什么”是没有意义的,但问“u8
的>>
的实现是什么”确实有意义。所以你可以尝试做的是定义Apply
,就像你定义的那样,现在:
impl<T, Res, F> std::ops::Shr<F> for T
where
T: Apply<Res>,
F: FnOnce(T) -> Res
type Output = Res;
fn shr(self, rhs: F) -> Res
rhs(self)
这个几乎有效,只是编译器报错,引用
只有在当前 crate 中定义的特征才能为类型参数实现
这个错误的原因是你不能保证另一个箱子没有为相同的类型实现相同的特征。如果另一个箱子定义了一个
impl<F: FnOnce(MyType) -> String> std::ops::Shr<F> for MyType ...
不清楚应该发生什么,因为现在>>
运算符已为同一类型定义了两次。如果您将 MyType
替换为您的板条箱本地的某些特定类型,您可以编写这样的 impl
,但当然现在 >>
的东西不适用于所有其他类型。
【讨论】:
谢谢,我知道运算符是关于类型的,但是,官方文档说“在 Rust 中,许多运算符可以通过特征重载。”我现在必须在我的问题中引用,如果您对那里的表达不满意,请向他们提出要求。 @KenSmooth 它说“可以通过特征重载”意味着它们可以被重载 使用 特征,而不是它们可以被重载 on 特征 我认为这样的上下文在我的问题中非常清楚,我不同意“用你的改写来询问“应用 >> 的实现是什么”是没有意义的。 @KenSmooth 文档的意思是,您可以使用例如std::ops::Shr
重载>>
、std::ops::Add
重载+
、std::ops::Deref
重载*
,等等。可以使用 particular 特征来重载运算符on types
即使使用宏也不可能吗? <T>T
上的运算符超长以上是关于是否可以为 apply::Apply 实现运算符重载?的主要内容,如果未能解决你的问题,请参考以下文章