Pracuję na porcie od Pythona do Rusta i natrafiłem na kod, który nie może być wyrażony w Rust tak naturalnie, jak w Pythonie.
Jednym z takich przypadków jest użycie parametrów domyślnych:
class Foo:
def __init__(self, a="Hello"):
self._a = a
W Rust możesz to zaimplementować za pomocą konstruktora:
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,
}
}
}
Aby użyć klasy w Pythonie, wystarczy:
foo = Foo("Hello, World!")
Jednak w Rust musisz napisać coś takiego:
let foo = FooBuilder::new().change_a("Hello, World!").build();
Prowadzi to do pytania: czy lepiej jest utrzymywać API dla portu, czy lepiej jest używać idiomów języka portowania? Czy to zależy od tego, jak dobrze interfejs API ma zacząć?