2012-10-12 25 views
9

Anladığımm Unit = void, ancak neden birden çok bağımsız değişkeni iletebiliyorum?Aşağıdaki scala kodu neden geçerli?

Bu yüzden, aşağıdaki kodun neden geçerli olduğunu açıklayan var mı? Eğer scala -print ile Snippet'inizi çalıştırırsanız

def foo(x: Unit) = println("foo")     
foo("ss", 1) 
+2

Neden birim türünde bir parametre oluşturuyorsunuz? Eğer bir parametre istemiyorsanız sadece foo() 'yi yapın. – sourcedelica

cevap

19

Eğer kabaca kodu için şu çıktıyı alırsınız: Gördüğünüz gibi

/* Definition of foo */ 
private def foo(x: scala.runtime.BoxedUnit): Unit = { 

/* Invocation of foo */ 
foo({ 
    new Tuple2("ss", scala.Int.box(1)); 
    scala.runtime.BoxedUnit.UNIT 
}); 

, foo için argümanlar yaratan bir kod bloğuna yeniden yazıldı Bir tuple ama sonra UNIT döndürür.

Bu davranış için iyi bir neden göremiyorum ve bunun yerine bir derleyici hatası almayı tercih ediyorum.

+2

Eğer 'foo (x: (String, Int)) 'öğesini tanımlarsanız, yukarıdaki gibi otomatik olarak tupledilmiş bir çift argüman ile yukarıdaki gibi çağırabilirsiniz. 'Birim' için herhangi bir şey iletilebileceğinden, tuple dönüşümünün tam olarak gösterdiğiniz gibi uygun olduğu görülüyor. Bunu sevdiğimden emin değilim, ama belki de genel olarak oto-tuplingin hatası mı? –

5

Buna iyi bir cevap verir İlgili bir soru buradadır: "Değer atmadan" Scala Language Specification v2.9 Bölüm 6.26.1 itibaren

Scala: Why can I convert Int to Unit?

:

e bazı varsa Değer türü ve beklenen tip Birimdir, e, {e;()}.

Yani, sizin durumda görünüyor tek argüman olarak tedavi edilebilir, böylece ("ss", 1) bu argümanı türü Birim olmadığından o zaman, dönüştürülür, bir tuplea dönüştürülüyor Bu tuple değerini hesaplayan bir blok sonra gerekli parametrenin tipine uyacak şekilde birim döndürür.

İlgili konular