如何在 Rust 中使用参数重载或可选参数?

2023-11-21

我正在尝试为二叉树编写一个打印函数,这是迄今为止我所拥有的:

impl TreeNode {
    fn print(&self) {
        self.print(0);
    }
    fn print(&self, level: u8) {
        for _i in range(0,level) {
            print!("\t");
        }
        match self.data {
            Some(x) => println!("{}",x),
            None => ()
        };
        match self.left {
            Some(ref x) => x.print(level+1),
            None => ()
        };
        match self.right {
            Some(ref x) => x.print(level+1),
            None => ()
        };
    }
}

我收到错误:值的重复定义print。所以我想知道是否有一种方法可以创建具有相同名称但不同参数的函数。或者可选参数可以解决这个问题,但我认为目前不可能(至少我无法通过谷歌搜索找到它)。

那么,最好的方法是什么?重命名第二个打印函数可以工作,但看起来很难看,并且如果我想(对于本例)从树的中间开始打印,则需要您记住多个函数名称。


Rust 没有重载,因此不可能有两个具有相同名称和不同参数集的函数或方法。

然而,有时可以用特征来模拟过载。这种方法可能不适合您的用例,但您可以看到它是如何完成的在标准库中, where Path::new()可以使用类似于字节向量的东西来调用构造函数:

Path::new("/a/b/c/d")   // argument is &str
Path::new(b"/a/b/c/d")  // argument is &[u8]
Path::new(Path::new("/a/b/c/d"))  // argument is another Path

这是通过以下方式完成的BytesContainer特质,以及new()方法定义如下:

fn new<T: BytesContainer>(bytes: T) -> Path { ... }

然后为您想要的所有类型实现此特征:

impl<'a> BytesContainer for &'a str { ... }
impl<'a> BytesContainer for &'a [u8] { ... }
impl BytesContainer for Path { ... }
// and more

这类似于重载,因为new()无论提供何种输入,都会执行完全相同的操作;这只是一个方便的事情Path构造函数更加灵活。到底new()只是将其参数转换为字节切片。但是,这不允许您拥有具有相同名称的完全不同的函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rust 中使用参数重载或可选参数? 的相关文章

随机推荐