【发布时间】:2018-03-14 21:52:44
【问题描述】:
我喜欢使用部分应用程序,因为它允许(除其他外)拆分复杂的函数调用,这样更具可读性。
部分应用示例:
fn add(x: i32, y: i32) -> i32 {
x + y
}
fn main() {
let add7 = |x| add(7, x);
println!("{}", add7(35));
}
这种做法有开销吗?
这是我喜欢做的事情(来自真实代码):
fn foo(n: u32, things: Vec<Things>) {
let create_new_multiplier = |thing| ThingMultiplier::new(thing, n); // ThingMultiplier is an Iterator
let new_things = things.clone().into_iter().flat_map(create_new_multiplier);
things.extend(new_things);
}
这纯粹是视觉效果。我不喜欢太多的东西。
【问题讨论】:
-
一般来说,LLVM 在消除此类抽象开销方面做得非常好。但是,如果您不确定,通常最好的办法是运行一些基准测试!
-
就最新的编译器而言,该特定示例将编译为
println!("{}", 42)。如果您将black_box输入到add7,您将得到println!("{}", 35 + 7)。您可能需要一个更复杂的示例才能找到确实发生开销的地方。 :) -
@E_net4 请不要从字面上理解这个例子。这只是部分应用的一个简单示例。
-
当然可以。另一方面,我们想知道您是否对部分应用程序的使用不那么琐碎,当然,您是否正在考虑替代实现或基线(例如,具有相同功能但没有闭包的东西部分应用)。
-
@E_net4 已编辑。