2016-03-25 15 views
0

Çözüldü. Örnekler için cevaba bakınız.Vala. Bir GTK konteynerinin tüm çocuklarını nasıl silersiniz?

çocuklarla bir kap var. Bütün çocukları silmem gerek. Bu C.'de kolaydır. Vala çalışmaz.

Aşağıdaki kod koleksiyonu için bir hata eksik tip argüman üretir.

var a_box = new Box (Orientation.VERTICAL, 0); 
// Add some children 
List children = a_box.get_children(); 
foreach (Widget element in children) { } 

Bu kodun yirmi varyasyonu artı birçok veri türü ile test ettim. Eksik tip şikayeti alamadığımda, bir widget olarak kullanılamayan bir veri türüyle sonuçlanırım, bu da onu yok edemem anlamına gelir.

, Vala değil C veya Python veya bu kolaydır birçok dillerden herhangi kullanarak nasıl bir kabın tüm çocukları kaldırırım? Görebildiğim kadarıyla

, çocukları almak için tek yol bir liste olarak ama Vala bir Liste girişi kaldırmak veya widget'lar yok etmek kullanılamaz.

Hem ben hem yapıyor birkaç C tabanlı uygulamalara sahip kaldırıp C. işlerini yok. Vala 0.30 derleyici Vala C kadar her çevirisini reddetmiş ve yazın argümanları eksik hakkında hatayı düzeltmek sadece tip argümanlar sunmak vb Valadocs

+0

Re: valadoc'tan örnekler, herhangi bir özel örnek verebilir misiniz? Eminim ki Florian herhangi bir kırık örnek hakkında bilgi edinmek ister… – nemequ

+0

@nemequ, Valadocs ve diğer kaynaklar hakkında biraz bilgi sahibi oldum. Valadocs, kullanıcıların kullanım örneklerini sunabileceği ve tartışabileceği PHP yorumları gibi bir şeye ihtiyaç duyuyor. – Peter

cevap

5

örnekler derlemek reddetti. Gtk.Container.get_children() için imza tipi List<weak Widget> diyor, öyleyse bu kullanalım:

var children = container.get_children(); 
foreach (Gtk.Widget element in children) 
    container.remove (element); 

Hatta sadece tamamen geçici değişken kaçının::

ayrıca sadece tip çıkarımı kullanabilirsiniz

Tabii
GLib.List<weak Gtk.Widget> children = container.get_children(); 
foreach (Gtk.Widget element in children) 
    container.remove (element); 

,

foreach (Gtk.Widget element in container.get_children()) 
    container.remove (element); 

Ama aklıma gelen en kolay yolu olacaktır:

container.forall ((element) => container.remove (element)); 
+0

İnanılmaz. Dört örneğiniz, kodunuzu tam olarak kopyaladığımda çalışır. – Peter

+0

Originall "var children =" üzerinde varyasyonları denedim ancak derleyici veya yürütme tipi uyumsuzluklardan şikayet ediyordu. Başarısız örneklerin kopyalarını saklamadım. Döngüde nelerin mevcut olduğunu bulmak için printf ekledim. Yine tip uyumsuzluklar vardı. Geri dönüp tekrar test edeceğim. Bu kodun daha sonraki bir gelişmesi için, silinmiş olanı bildirmek için bir kutu veya ızgara vb. Olup olmadığını bilmem gerekecek. – Peter

+0

.forall açıklamasında kapsayıcı nesnesine ait nesneleri siler. Bu, bazı konteyner türleri için .forall'ın çok fazla sileceğini gösterir. .forall bir kutu için çalışır. Izgara ve benzeri kapların .forall'dan sonra başarısız olmasını bekliyorum. Hangi kapların başarısız olacağına dair belge bulamadım. .get_children kullanarak sürümleri ile yapışacağım. – Peter