Go ile tanıştım, içinde birkaç küçük program yazdım. Pas, elbette, daha az aşina olacağım ama göz kulak olacağım.
Son zamanlarda http://yager.io/programming/go.html okuduktan sonra , Generics'in ele alınmasının iki yolunu şahsen inceleyeceğimi düşündüm, çünkü makale, haksız yere eleştirdi gibi görünüyordu. zarifçe başaramadı. Rust'un Özelliklerinin ne kadar güçlü olduğuna dair yutturmaca duydum ve insanlardan Go hakkındaki eleştirilerden başka hiçbir şey duymadım. Go'da biraz tecrübe sahibi olarak, bunun ne kadar doğru olduğunu ve nihayetinde farklılıkların ne olduğunu merak ettim. Bulduğum şey, Özellikler ve Arayüzlerin oldukça benzer olmasıydı! Nihayetinde bir şeyi kaçırıp kaçırmadığımdan emin değilim, bu yüzden benzerliklerinin hızlı bir şekilde öğrenildiği ve böylece neyi özlediğimi söyleyebileceksiniz!
Şimdi Go Interfaces'e belgelerine bakalım :
Go'daki arayüzler bir nesnenin davranışını belirtmenin bir yolunu sağlar: eğer bir şey yapabilirse, o zaman burada kullanılabilir.
En yaygın arayüz, Stringer
nesneyi temsil eden bir dize döndürendir.
type Stringer interface {
String() string
}
Yani, String()
üzerinde tanımlanmış olan herhangi bir Stringer
nesne bir nesnedir. Bu, func (s Stringer) print()
neredeyse tüm nesneleri alan ve bunları basan tür imzalarında kullanılabilir .
Aynı zamanda interface{}
herhangi bir nesneyi alan var. Daha sonra yansıma yoluyla çalışma zamanında türü belirlemeliyiz.
Şimdi, Pas Özelliklerine belgelerine bakalım :
En basit haliyle, özellik sıfır veya daha fazla yöntem imza kümesidir. Örneğin, konsola yazdırılabilecek şeyler için Yazdırılabilir özelliğini tek bir yöntem imzası ile ilan edebiliriz:
trait Printable {
fn print(&self);
}
Bu hemen Go Arayüzlerimize oldukça benziyor. Gördüğüm tek fark, sadece yöntemleri tanımlamak yerine, Özelliklerin Uygulamalarını tanımlamamızdır. Öyleyse yapıyoruz
impl Printable for int {
fn print(&self) { println!("{}", *self) }
}
onun yerine
fn print(a: int) { ... }
Bonus Soru: Bir özelliği uygulayan ancak kullanmadığınız bir işlevi tanımlarsanız Rust'ta ne olur impl
? Sadece çalışmıyor mu?
Go'nun Arayüzlerinden farklı olarak, Rust'un tip sistemi, interface{}
derleyici ve çalışma zamanı aslında türü bildiğinde uygun jenerikler ve benzeri şeyler yapmanızı sağlayan tip parametrelerine sahiptir . Örneğin,
trait Seq<T> {
fn length(&self) -> uint;
}
herhangi bir tür üzerinde çalışır ve derleyici , sıra öğelerinin türünün yansıma kullanmak yerine derleme zamanında olduğunu bilir .
Şimdi, asıl soru: Burada herhangi bir fark eksik mi? Gerçekten o kadar benzer mi? Burada özlediğim daha temel bir fark yok mu? (Kullanımda. Uygulama detayları ilginç, ancak aynı şekilde çalışması durumunda sonuçta önemli değil.)
Sözdizimsel farklılıkların yanı sıra, gördüğüm gerçek farklar:
- Go otomatik bir yöntem gönderme yerine, Rust
impl
bir Özelliği uygulamak için gerekli- Zarif vs Açık
- Rust, yansımasız uygun jeneriklere izin veren tip parametrelerine sahiptir.
- Go burada gerçekten bir cevap yok. Bu, çok daha güçlü olan tek şey ve sonuçta farklı tipteki imzalarla kopyalama ve yapıştırma yöntemlerinin yerine geçiyor.
Bunlar sadece önemsiz olmayan farklar mı? Öyleyse, görünüşte Go'nun Arayüz / Tip sistemi pratikte algılanan kadar zayıf değildir.
AnyMap
kendim, Go'nun zorunlulukta yazabileceği kırılgan bir şeyin güvenli ve etkileyici bir soyutlamasını sağlamak için özellik nesnelerini jeneriklerle birleştiren Rust'in güçlü yönlerinin iyi bir göstergesidirmap[string]interface{}
.