gpt4 book ai didi

rust - 有没有办法在没有宏的情况下为 Rust 中的结构实现做 var args?

转载 作者:行者123 更新时间:2023-11-29 08:06:57 25 4
gpt4 key购买 nike

我以前见过这种类型的 var args:

#![feature(macro_rules)]

struct Foo;

impl Foo {
fn add2(&self, a:int, b:int) -> int {
return a + b;
}
fn add3(&self, a:int, b:int, c:int) -> int {
return a + b + c;
}
fn add4(&self, a:int, b:int, c:int, d:int) -> int {
return a + b + c + d;
}
}

macro_rules! add(
($foo:ident, $a:expr, $b:expr) => (
$foo.add2($a, $b);
);
($foo:ident, $a:expr, $b:expr, $c:expr) => (
$foo.add3($a, $b, $c);
);
($foo:ident, $a:expr, $b:expr, $c:expr, $d:expr) => (
$foo.add4($a, $b, $c, $d);
);
)

fn main() {
let foo = Foo;
println!("Add:{}", add!(foo, 1, 2));
println!("Add:{}", add!(foo, 1, 2, 3));
println!("Add:{}", add!(foo, 1, 2, 3, 4));
}

(是的,没错,我使用显式返回,因为 ;/no ; 语义糟糕 imo)

无论如何,有没有一种方法可以做类似的事情而不必使用笨拙的 call!(obj, ...) 语法,并使用您通常使用的更自然的 obj.call(...) 语法?

最佳答案

Rust 目前不支持可变函数。

另一种更惯用的设计是使用数组和迭代:

fn add(&self, numbers: &[int]) -> int {
numbers.iter().sum() // … or whatever iteration stuff you want
}

当使用方法内联进行优化构建时(您可以将 #[inline] 放在方法上,然后它也可以跨箱工作),这将与任意函数一样高效许多争论,如果 LLVM 优化器认为那会更便宜。


实际上是这样,但仅适用于 C ABI 的外部函数。不适用于 Rust 函数。

关于rust - 有没有办法在没有宏的情况下为 Rust 中的结构实现做 var args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com