我正在尝试为二叉树编写打印功能,这是到目前为止的内容:
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 => ()
};
}
}
我收到错误:value的重复定义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()
只是将其参数转换为字节片。但是,这不允许您使用完全相同的名称拥有完全不同的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句