Rust'u öğrenmeye çalışıyorum ve daha önce yaptığım birçok kişi gibi pratik yapmak için bir Fibonacci dizisi yineleyici yazdım. İlk geçişim u32
s kullanıldı ve iyi çalıştı, bu yüzden genel bir sürüm yazmaya karar verdim. Bu benim sonucudur: Rust'ta aşırı klonlama nasıl önlenir?
use num::Integer;
use std::ops::Add;
pub struct Fibonacci<T: Integer + Add + Clone> {
nth: T,
n_plus_one_th: T,
}
impl<T: Integer + Add + Clone> Iterator for Fibonacci<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
let temp = self.nth.clone();
self.nth = self.n_plus_one_th.clone();
self.n_plus_one_th = temp.clone() + self.n_plus_one_th.clone();
Some(temp)
}
}
impl<T: Integer + Add + Clone> Fibonacci<T> {
pub fn new() -> Fibonacci<T> {
Fibonacci {
nth: T::one(),
n_plus_one_th: T::one(),
}
}
}
Ben
u32
ve
num::BigUint
ile bu test, ve iyi çalışıyor. Yine de,
next
yöntemindeki tüm klonlama konusunda endişeliyim. Özellikle, ekleme adımı sırasında neden klonlamaya ihtiyacım olduğunu anlamıyorum.
Bunu, Rust'un daha gelişmiş referans kavramlarından bazılarını kullanarak yazmak için daha iyi bir yol olduğundan şüphe duyuyorum, ama şimdiye kadar bunu çözemedim.
Hızlı bir takip: Yapının kendisinde herhangi bir özellik sınırı koymadığınızı fark ettim, sadece uygulamalarda. Bu bir Rust sözleşmesi mi? –
@MarkTozzi Çoğunlukla kişisel tercihlere göre. Bir türü "yanlış kullanmak" için daha zor yapmak istiyorsanız, her yerde sınırları tekrarlayabilirsiniz, ancak bir örnek için overkill görünüyordu. –
Herkesin de merak ettiği durumda: "Nerede" yapıtı (Magic of the Magic) Yüksek Sırada Trait Bounds (HRTBs) olarak adlandırılır ve burada https://doc.rust-lang.org/nomicon/hrtb adresinde belgelenir. html – Sebastian