我正在研究从Python到Rust的移植,并遇到了一些代码,这些代码在Rust中无法像在Python中那样自然地表达。
一种情况是使用默认参数:
class Foo:
def __init__(self, a="Hello"):
self._a = a
在Rust中,您可以使用构建器来实现:
struct FooBuilder {
a: &'static str,
}
struct Foo {
_a: &'static str
}
impl FooBuilder {
fn new() -> FooBuilder {
FooBuilder {
a: "Hello",
}
}
fn change_a(self, new_a: &'static str) -> FooBuilder {
FooBuilder {
a: new_a,
..self
}
}
fn build(self) -> Foo {
Foo {
_a: self.a,
}
}
}
要在Python中使用该类,只需:
foo = Foo("Hello, World!")
但是,在Rust中,您需要编写如下内容:
let foo = FooBuilder::new().change_a("Hello, World!").build();
这就引出了一个问题:为端口维护API更好还是使用移植语言的习语更好?它是否取决于API的知名度?
2
类的API是如何使用它的,而不是如何用代码表示的。因此,该翻译与ABI截然不同且笨拙。
—
Deduplicator 2015年
在哪里说那是惯用的Rust?
—
Nadir Sampaoli 2015年
对不起,我一定误会了。您发布了一些Rust代码以及一个难题:天气情况下,您将维护端口的API或使用移植语言的习语。该代码看起来与上述两种情况都不一样。如果这是正确的解释,那么该代码示例的目的是什么?它描述了什么?它与实际问题有什么关系?
—
Nadir Sampaoli 2015年