Tôi đang làm việc trên một cổng từ Python sang Rust và chạy vào một số mã không thể được thể hiện một cách tự nhiên trong Rust như họ có thể trong Python.
Một trường hợp này là sử dụng các tham số mặc định:
class Foo:
def __init__(self, a="Hello"):
self._a = a
Trong Rust, bạn có thể thực hiện điều này bằng cách sử dụng trình xây dựng:
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,
}
}
}
Để sử dụng lớp trong Python, chỉ cần:
foo = Foo("Hello, World!")
Tuy nhiên, trong Rust, bạn sẽ cần phải viết một cái gì đó như:
let foo = FooBuilder::new().change_a("Hello, World!").build();
Điều này dẫn đến câu hỏi: tốt hơn là duy trì API cho một cổng, hay tốt hơn là sử dụng các thành ngữ của ngôn ngữ chuyển? Có phụ thuộc vào mức độ nổi tiếng của API bắt đầu không?