Я работаю над портом от 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 известен с самого начала?