gpt4 book ai didi

function - Rust 中的默认函数参数

转载 作者:行者123 更新时间:2023-11-29 07:40:05 26 4
gpt4 key购买 nike

是否可以创建带有默认参数的函数?

fn add(a: int = 1, b: int = 2) { a + b }

最佳答案

由于不支持默认参数,您可以使用 Option<T> 获得类似的行为。

fn add(a: Option<i32>, b: Option<i32>) -> i32 {
a.unwrap_or(1) + b.unwrap_or(2)
}

这实现了让默认值和函数仅编码一次(而不是在每次调用中)的目标,但当然需要输入更多内容。函数调用看起来像 add(None, None) ,您可能喜欢也可能不喜欢,这取决于您的观点。

如果您发现参数列表中没有输入任何内容,因为编码人员可能会忘记做出选择,那么这里的最大优势在于明确性;调用者明确表示他们想要使用您的默认值,如果他们什么都不输入,将会出现编译错误。将其视为键入 add(DefaultValue, DefaultValue) .

你也可以使用宏:

fn add(a: i32, b: i32) -> i32 {
a + b
}

macro_rules! add {
($a: expr) => {
add($a, 2)
};
() => {
add(1, 2)
};
}
assert_eq!(add!(), 3);
assert_eq!(add!(4), 6);

这两种解决方案的最大区别在于,使用“Option”-al 参数,编写 add(None, Some(4)) 是完全有效的,但是使用宏模式匹配你不能(这类似于 Python 的默认参数规则)。

您还可以使用“参数”结构和 From/Into特点:

pub struct FooArgs {
a: f64,
b: i32,
}

impl Default for FooArgs {
fn default() -> Self {
FooArgs { a: 1.0, b: 1 }
}
}

impl From<()> for FooArgs {
fn from(_: ()) -> Self {
Self::default()
}
}

impl From<f64> for FooArgs {
fn from(a: f64) -> Self {
Self {
a: a,
..Self::default()
}
}
}

impl From<i32> for FooArgs {
fn from(b: i32) -> Self {
Self {
b: b,
..Self::default()
}
}
}

impl From<(f64, i32)> for FooArgs {
fn from((a, b): (f64, i32)) -> Self {
Self { a: a, b: b }
}
}

pub fn foo<A>(arg_like: A) -> f64
where
A: Into<FooArgs>,
{
let args = arg_like.into();
args.a * (args.b as f64)
}

fn main() {
println!("{}", foo(()));
println!("{}", foo(5.0));
println!("{}", foo(-3));
println!("{}", foo((2.0, 6)));
}

这种选择显然需要更多代码,但与宏设计不同,它使用类型系统,这意味着编译器错误将对您的库/API 用户更有帮助。这也允许用户制作自己的 From如果这对他们有帮助,请实现。

关于function - Rust 中的默认函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047686/

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