2012-01-11 17 views

cevap

21

, .. biraz düştü, bir lehine, daha çok yönlü -> ile değiştirilir.

(-> (NutritionFacts$Builder. 240 8) 
    (.calories 100) 
    (.sodium 350) 
    (.carbohydrates 27) 
    (.build)) 

Bir çift daha fazla karakter var, ama iki şey kazanmak: Şahsen ben tercih

  • belirginliği. . tam orada olduğu için, sodyum hattına bakabilirim (örneğin) ve bunun bir Java yöntem çağrısı olduğunu söyleyebilirim.
  • Esneklik. İhtiyacım olursa, ortadaki metot dışı çağrıları (stdout'a yazdırarak söyler) zincirleyebilirim ya da tüm bu mesajların sonunda başka bir işlev çağrısında bulunabilirim.

, bu soruya her cevap sınıfadı yanlış almış En önemlisi: Java'nın NutritionFacts.Builder NutritionFacts $ Oluşturucu adında gerçek JVM sınıfı üzerindeki dil şeker, ve bu sınıf bir Clojure beri (başvurması gerekir ise kodumuzu derlemek için javac kullanmıyoruz).

Ben doto öneri katılmıyorusunuz: Bu Oluşturucu sınıf tek bir örneğini mutasyona ve sonra iade ederek onun yöntemi-zincirleme uygulamak olur çünkü sadece çalışır. doto, yerinde mutasyon gerektiren Java nesneleri için mükemmeldir, ancak bir sınıf, değiştirilemez gibi davranmak için yeterince nazik olduğunda gerçekten yöntem zincirleme sürümünü kullanmanız gerekir (yani, ->).

3

:

(doto 
    (NutritionFacts.Builder. 240 8) 
    (.carbohydrates 27) 
    (.sodium 35) 
    (.calories 100) 
    (.build) 
) 

EDIT'e : @
@Goran Jovic'in işaret ettiği gibi, bu, ilk formda oluşturulan nesne üzerindeki tüm yöntemleri çağırır.
Bu durumda, Java kodu yöntem zincirleme kullandığından, ancak daha genel olarak geçerli olmadığı için bu durumda çalışır.

+0

tek sebebi. Sadece bir [doto] (https://github.com/clojure/clojure/blob/f5f827ac9fbb87e770d25007472504403ed3d7a6/src/clj/clojure/core adresine yerleştirin.clj # L3395) ve bu iyi! –

+0

@Goran Jovic Kodu önerdiğiniz gibi değiştirdim. Teşekkürler! –

+0

Yup, işte bu kadar. 'Doto' ile' ..' arasındaki ana farkın, doto'nun ilk biçim tarafından tanımlanan bir nesnede yöntemleri çağırması olduğunu ve '..' her birinin bir öncekinin sonucuna göre yapıldığını unutmayın. Bu durumda, Java yöntemleri oluşturulmakta olan nesneyi döndürmeye devam ettiğinden aynıdır. –

2

(.. (NutrionalFacts.Builder. 240 8) (calories 100) (sodium 35) (carbohydrates 27) (build))

8

kullanın .. makro. Bu iki ardışık nokta. Birbirinin sonucundaki sonraki Java yöntemini art arda çağırmak için ihtiyacınız olanı sağlar.

Etrafa bir repl yok, ancak satır gibi bir şey çevirmek gerekir: bu diğer yanıtlar concision karşı çıkmak zor olsa da

(.. (NutritionFacts.Builder. 240 8) 
    (calories 100) 
    (sodium 350) 
    (carbohydrates 27) 
    (build)) 
0

Bu iş parçacığı birkaç yaşındadır ve iş parçacığı ilk makrosu, söyleyebildiğim kadar hala tercih edilen yoldur, ancak $ sözdizimi gerekli değildir. bölü (/) olarak iyi çalışır: Birkaç ayrı formlarda bir var mutasyona çünkü deyimsel değildir

(-> (Caffeine/newBuilder) 
     (.maximumSize 10000) 
     (.build)) 
+0

'(Caffeine/newBuilder)' statik bir yönteme (Java 'Caffeine.newBuilder()') bir çağrıdır, '(NutritionalFacts $ Builder.) 'Ise statik bir kurucunun (Java' yeni NutritionalFacts) yapıcısına yapılan bir çağrıdır. Builder() '), bu gerçekten kabul edilen cevaptan farklı değil. – glts

+0

ahh, tamam. Sözdizimi için bazı güncellemeler olduğunu düşündüm. Teşekkürler – Alex

İlgili konular