有可能创建一个带有默认参数的函数吗?

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

当前回答

不,Rust不支持默认函数参数。你必须用不同的名字定义不同的方法。也没有函数重载,因为Rust使用函数名派生类型(函数重载要求相反)。

在结构初始化的情况下,你可以像这样使用结构更新语法:

use std::default::Default;

#[derive(Debug)]
pub struct Sample {
    a: u32,
    b: u32,
    c: u32,
}

impl Default for Sample {
    fn default() -> Self {
        Sample { a: 2, b: 4, c: 6}
    }
}

fn main() {
    let s = Sample { c: 23, ..Sample::default() };
    println!("{:?}", s);
}

[应要求,我交叉发布了一个重复问题的答案]

其他回答

在前面答案的基础上,请记住,您可以创建与现有变量同名的新变量,这将隐藏之前的变量。如果你不打算使用Option<…>了。

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

如果你使用Rust 1.12或更高版本,你至少可以让函数参数更容易使用Option和into():

fn add<T: Into<Option<u32>>>(a: u32, b: T) -> u32 {
    if let Some(b) = b.into() {
        a + b
    } else {
        a
    }
}

fn main() {
    assert_eq!(add(3, 4), 7);
    assert_eq!(add(8, None), 8);
}

不,目前还没有。我认为它很可能最终会实现,但目前在这个领域还没有活跃的工作。

这里采用的典型技术是使用具有不同名称和签名的函数或方法。

Rust不支持默认函数参数,而且我认为将来也不会实现。 所以我写了一个proc_macro duang来实现它的宏形式。

例如:

duang! ( fn add(a: i32 = 1, b: i32 = 2) -> i32 { a + b } );
fn main() {
    assert_eq!(add!(b=3, a=4), 7);
    assert_eq!(add!(6), 8);
    assert_eq!(add(4,5), 9);
}

不,Rust不支持默认函数参数。你必须用不同的名字定义不同的方法。也没有函数重载,因为Rust使用函数名派生类型(函数重载要求相反)。

在结构初始化的情况下,你可以像这样使用结构更新语法:

use std::default::Default;

#[derive(Debug)]
pub struct Sample {
    a: u32,
    b: u32,
    c: u32,
}

impl Default for Sample {
    fn default() -> Self {
        Sample { a: 2, b: 4, c: 6}
    }
}

fn main() {
    let s = Sample { c: 23, ..Sample::default() };
    println!("{:?}", s);
}

[应要求,我交叉发布了一个重复问题的答案]