Các ràng buộc T: Mul
không có nghĩa là kết quả của các nhà điều hành nhị phân cũng là loại T
. Loại kết quả là một loại liên kết được liên kết của đặc điểm này: Output
.
Vấn đề khác là tại một thời điểm nào đó, các đặc điểm của nhà điều hành chuyển từ chuyển giới thiệu sang giá trị truyền qua. Trong mã chung, điều này có thể là một chút đau ở mông (ít nhất là bây giờ) bởi vì các toán tử này tiêu thụ toán hạng của chúng trừ khi bạn cũng yêu cầu các loại là Copy
.
Chỉ để hoàn thành (trong trường hợp bạn không muốn yêu cầu Copy
), hãy để tôi thêm một số thông tin về hướng thay thế có thể có.
Vì lợi ích của mã chung, tác giả của "kiểu dữ liệu" được khuyến khích để cung cấp thêm không tốn triển khai của những đặc điểm điều hành để bạn không cần Copy
hoặc Clone
. Ví dụ, các thư viện chuẩn đã cung cấp triển khai như sau:
f64 implements Mul< f64>
f64 implements Mul<&f64>
&f64 implements Mul< f64>
&f64 implements Mul<&f64>
với nhau thực hiện có f64
như Output
loại.Nhưng việc sử dụng các đặc điểm này trực tiếp không đẹp:
fn cube<T>(x: &T) -> T
where for<'a> T: Mul<&'a T, Output = T>,
for<'a,'b> &'a T: Mul<&'b T, Output = T>
{
x * x * x
}
Cuối cùng, chúng ta có thể nhận được một số đặc điểm mức cao hơn (hơi) sẽ giảm tiếng ồn. Ví dụ: T: Mul2
có thể ngụ ý T: Mul<T> + Mul<&T>
và &T: Mul<T> + Mul<&T>
. Nhưng tại thời điểm viết bài này, trình biên dịch Rust dường như không thể xử lý được điều này. Ít nhất tôi không thể biên dịch thành công mã sau đây:
use std::ops::Mul;
pub trait Mul2 where
Self: Mul<Self, Output=Self>,
Self: for<'a> Mul<&'a Self, Output=Self>,
for<'a> &'a Self: Mul<Self, Output=Self>,
for<'a,'b> &'a Self: Mul<&'b Self, Output=Self> {}
impl<T> Mul2 for T where
T: Mul<T, Output=T>,
T: for<'a> Mul<&'a T, Output=T>,
for<'a> &'a T: Mul<T, Output=T>,
for<'a,'b> &'a T: Mul<&'b T, Output=T> {}
fn cube<T: Mul2>(x: &T) -> T {
x * x * x
}
fn main() {
let c = cube(&2.3);
println!("Hello, world! {}", c)
}
Tôi nghĩ rằng mọi thứ sẽ cải thiện trong lĩnh vực này. Hiện tại, khả năng thực hiện chung các thuật toán số trong Rust là không tốt như tôi mong muốn.
Bạn cũng có thể giải thích (hoặc chỉ đưa ra một liên kết) ký hiệu "ở đâu", tôi chưa từng thấy nó trước đây. –
trong đó các mệnh đề là cách tổng quát hơn để hạn chế các tham số chung. Chúng đã được giới thiệu qua https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md – sellibitze
Ký hiệu 'for <'a> 'được giới thiệu trong RFC 387: https://github.com /rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md. –