Rust'u öğrenmeye çalışıyorum ama yapmam gereken tek şey, duvara (benim için) tanıdık olan java konseptlerini tür sistemine çekmeye çalışmaktır. Ya da ayakkabı çekirdeği Haskell kavramları, vb için deneyin.Paylaşılan değişebilir durum nasıl temsil edilir?
Player
ve birçok Resource
s ile bir oyun yazmak istiyorum. Her Resource
biri Player
ait olabilir:
struct Player {
points: i32,
}
struct Resource<'a> {
owner: Option<&'a Player>,
}
fn main() {
let mut player = Player { points: 0 };
let mut resources = Vec::new();
resources.push(Resource {
owner: Some(&player),
});
player.points = 30;
}
Ben oyuncuya kaynak noktasını olamaz çünkü değiştirerek aynı anda iken, derlemek değildir: Üstelik
error[E0506]: cannot assign to `player.points` because it is borrowed
--> src/main.rs:15:5
|
13 | owner: Some(&player),
| ------ borrow of `player.points` occurs here
14 | });
15 | player.points = 30;
| ^^^^^^^^^^^^^^^^^^ assignment to borrowed `player.points` occurs here
Resource
, Player
için değiştirilebilir bir başvuruya sahipse, aynı kullanıcıyla iki Resource
s bile elde edemedim.
Bu gibi durumları çözmenin Pas yolu nedir?
Sorumu basitleştirilmiş ve Shepmaster cevabı buna bir doğru cevap ise (ne sordum ben gerçekten sormak istediği bu değildi çünkü), ben almak istedim bu değil. Onu yeniden yorumlamaya ve daha fazla bağlam eklemeye çalışacağım.
- kaynakları bir şekilde bağlanır - tüm kaynakların haritası (me) çizge oluşturur.
- Her oyuncu çok kaynağa sahip olabilir, her kaynak bir oyuncuya ait olabilir. Oyuncu kendi sahip olduğu kaynaklardan puan alabilmelidir.
fn addPoints(&mut self, allResources: &ResourcesMap) ->()
gibi bir imzayı düşündüm. - Müzikçalardan birine bağlı olan bir kaynağı başka bir oyuncudan alabilir. Diğer oyuncu için bazı puan kaybıyla sonuçlanabilir.
sorunlar:
- ne (her bir düğüm birçok düğümlerden işaret edilebilir bir olasılıkla siklik yapı,) Rust bu grafik temsil etmek?
- Özgün sorun:
Resource
birPlayer
işaret ediyorsa, oynatıcıyı değiştiremem!
Player
için Resource
s nokta - çünkü, Oyuncu A'nın kaynakların bir kısmını başlamak çıkarmak oyuncu B'ye bir oyuncunun B kaynağa ve bu kaynaktan harita üzerinden hareket etmek olacaktır böyle bir işlem yapmak için doğal bir yol puanlar. Rust'ta doğal görünmüyor (en azından benim için).
iyi geliyor. Sanırım zamanı güvenliğini derleme ödün vermeden Rust-yolla yapılabilir, Rust Java kodunu yazmaya çalışıyor yapmaya çalışıyorum ne olur Beni ilgilendiren, nedir? Hiç değişken durumunu paylaşılan kaçının? –
Not: derleme zamanlı güvenliğinden taviz verilmez. Pas Eğer kütüphaneleri doğru kullandığınız (derleme zamanında) emin olur. Eğer ödünç * işlevlerini kullanmak Yine de, programınız, zamanında panik olabilir. Eğer try_borrow * işlevlerini kullanın Bunun yerine, işlem başarılı olmuş, sen kontrol edebilir ve eğer bazı geri dönüş işlemini yapmak. –
Ayrıca türe RefCell bir başvuru sayılan kutu (http://doc.rust-lang.org/std/rc/index.html) kullanabilir. O zaman sadece döngüleri oluşturmaz, ya da bellek serbest asla emin olmak gerekir. Bu gibi daha fazla Java olacaktır (Java otomatik döngüleri bulur rağmen) –