以 ruby 中的 init 字段类为例。我想用 Rust 重写它。我设法用第二个代码段做到了,但我觉得每次都传递 self 来访问结构字段有点奇怪。我在做反模式吗?什么是更好的解决方案?非常感谢 <333
class Workspace
def initialize(pathname)
@pathname = pathname
end
def list_files
Dir.entries(@pathname)
end
end
// implementation
pub struct Workspace {
pathname: i32,
}
impl Workspace {
pub fn new(pathname: i32) -> Self {
Self { pathname }
}
pub fn list_files(self) {
println!("{}", self.pathname);
}
}
// pilot
let workspace = Workspace::new(5);
Workspace::list_files(workspace);
为了补充 Zeppi 的答案:self
由于借用,在 Rust 中具有显式(但有特权)参数非常重要:当您定义时fn list_files(self)
,它可以被称为:
workspace.list_file()
但是self
(因此workspace
) 被移动了,这意味着它被调用消耗了,之后不能使用(尝试list_file
第二次调用,你会得到一个错误)。
要更改行为,您必须指出该方法不使用主题,这是通过self
使用参考信息进行注释来完成的,例如
fn list_file(&self)
可以以相同的方式调用,但只会在方法调用期间借用 workspace
,workspace
之后仍然可用。
还有
fn list_file(&mut self)
它更新工作区(并要求将变量定义为let mut workspace = ...
)。
因此,正如 Zeppi 指出的那样,这种“显性自我”不仅非常普遍,而且实际上对 Rust [0]非常重要。支持统一函数调用语法时也更自然,这正是您在原始帖子中使用它的方式。
[0] 从技术上讲,这个问题可以用不同的方式解决,例如 Swift 有一个隐式的self
和注释的方法,但是&
/&mut
注释在 rust 中是标准的,所以重用它们比为同一件事添加单独的语法更有意义
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句