如何在锈蚀中使用参数重载或可选参数?
我正在尝试为二叉树编写一个打印函数,以下是我目前为止的内容:
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
重复定义。 所以我想知道是否有一种方法来创建具有相同名称但参数不同的函数。 或者可选的参数可以解决这个问题,但我认为目前还不可能(至少我无法通过Google搜索找到它)。
那么,做到这一点的最好方法是什么? 重命名第二个打印函数,但看起来很难看,并且如果我想(对于本示例)从树的中间开始打印,则需要记住多个函数名称。
Rust没有超载,所以不可能有两个具有相同名称和不同参数组的函数或方法。
但是,有时候可以用特征来模拟超载。 这种方法可能不适合你的用例,但你可以看到它是如何在标准库中完成的,其中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
trait完成的, 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()
只是将它的参数转换为字节片。 但是,这不允许您使用相同的名称具有完全不同的功能。
上一篇: How do I use parameter overloading or optional parameters in rust?