Je travaille sur un port de Python à Rust et j'ai rencontré du code qui ne peut pas être exprimé aussi naturellement dans Rust que dans Python.
Un cas de cela utilise des paramètres par défaut:
class Foo:
def __init__(self, a="Hello"):
self._a = a
Dans Rust, vous pouvez implémenter cela à l'aide d'un générateur:
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,
}
}
}
Pour utiliser la classe en Python, c'est simplement:
foo = Foo("Hello, World!")
Cependant, dans Rust, vous auriez besoin d'écrire quelque chose comme:
let foo = FooBuilder::new().change_a("Hello, World!").build();
Cela conduit à la question: est-il préférable de maintenir une API pour un port, ou est-il préférable d'utiliser des idiomes du langage de portage? Cela dépend-il de la notoriété de l'API?