Kapaklar kapalıysa, üzerinde çok sayıda güçlü fonksiyonel stil tekniğini kullanabileceğimi varsayabilir miyim?Smalltalk'ın kapanmaları var mı?
cevap
Evet, Smalltalk'ın kapanmaları var.
sum := [ :a :b | a + b ].
Kapaklar, örneği geçti etrafında ve manipüle edilebilir nesnelerdir: Aşağıdaki kod iki argümanının toplamını döndüren bir kapatma oluşturur. Eğer value
, value:
, value:value:
göndermek bir kapatma ... değerlendirmek
sum value: 1 value: 2.
Kapaklar belirgin yinelemenizi koleksiyonları, filtre, harita, ... bir koleksiyonun tüm değerleri ile kullanılır:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
Dahası, döngüler gibi kontrol yapılar için kullanılır:
[ iterator hasNext ]
whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
da koşul uygulanmaktadır kullanılarak kilitler:
condition
ifTrue: [ do this ]
ifFalse: [ do that ]
Pharo onlara sahip:
tüm VM kapatma desteği son görüntüleri
makeAdder := [ :x | [ :y | x + y ]].
add2 := makeAdder value: 2.
add2 value: 3.
İade 5
için gerekli var.
makeCounter := [ :init | [ init := init + 1. init ]].
çalışmaz (Cannot store into ->init …
), CL (örneğin) gibi: Ben yanılmıyorsam
CL-USER> ((lambda (init) (lambda() (incf init))) 0)
#<COMPILED-LEXICAL-CLOSURE #xC7A495E>
CL-USER> (funcall *)
1
CL-USER> (funcall **)
2
CL-USER> (funcall ***)
3
, bundan önce çalışmak için kullanılan yeni kapatma derleyicisi tanıtıldı. Yeni derleyici ile neden çalışmadığından emin değilim.
Blok ve yöntem argümanları Smalltalk'ta salt okunurdur. Bazı eski derleyiciler blok argüman yazıyor olsa da düzgün kontrol etmedi. –
Açıklama için teşekkürler, Lukas! – danlei
Ancak, şu gibi bir blok yerel temp kullanabilirsiniz: makeCounter: = [: init | | saymak | saymak: = init. [sayım: = say + 1 sayım]]. (makeCounter değeri: 3) değeri; değer –
- 1. - Bir fark var mı?
- 2. 'Geri arama' var mı?
- 3. console.memory eşdeğeri var mı?
- 4. sapply eşdeğeri var mı?
- 5. Kimlik borusu var mı?
- 6. OrderedDict anlayışı var mı?
- 7. Neden Dictionary.TrimExcess() var mı?
- 8. shazam özelliği var mı?
- 9. JSP editörü, var mı?
- 10. "ApplicativeIO" sınıfı var mı?
- 11. WPF'de form.onload var mı?
- 12. Array_rand() değeri var mı?
- 13. Saygısız biginteger var mı?
- 14. Bellek sızıntısı var mı?
- 15. Simge systray'da var mı?
- 16. 'elseif' hala var mı?
- 17. Sonsuz döngü var mı?
- 18. -Xmx'de permgen var mı?
- 19. Durum var mı?
- 20. python sürümü var mı?
- 21. aiohttp ORM var mı?
- 22. Kapsülleme ihlali var mı?
- 23. mallet'in GUI'si var mı?
- 24. JArchitect'e alternatif var mı?
- 25. python lxml var mı?
- 26. Python'da işlevler var mı?
- 27. Predis belgeleri var mı?
- 28. Nesnede var mı yoksa javascriptte mi var
- 29. json.net anahtar yöntem var mı?
- 30. WGET zaman aşımı var mı?
İlk örneğiniz yalnızca "value: value:" iletisiyle sağlanan parametreleri alır, ancak 'whileTrue:' örneğiniz, bloğun dışında tanımlanmış olan 'yineleyici' değişkenini kullanan bloklara sahiptir. Bir lambda ve diğeri bir kapanış mı, yoksa Smalltalk'ta bir fark yok mu? – quamrana
@quamrana: (Görünür) fark yoktur. Smalltalk uygulamalarının çoğu, dış değişkenlerin kullanımına bağlı olarak kapatma nesnelerini optimize eder. Tüm kapaklar aynı mesajları anlar, böylece bir geliştirici olarak sizin için hiçbir fark yoktur. –