2010-09-10 22 views
17

Her zaman ihtiyacım olan her zaman hat uzun tuple tanımını tekrarlamak benim için çok iyi görünmüyor. Sadece adını ve tür adı olarak kullanabilir miyim? onun alanlarını isim güzel de yerine ilk soruya gelince ._1, ._2 vbScala 2.8'de bir tuple ismini verebilir miyim?

cevap

31

kullanarak olur, sadece bir tip takma adı kullanabilirsiniz: tabii ki,

type KeyValue = (Int, String) 

Ve Scala bir olduğunu bu kadar

case class KeyValue(key: Int, value: String) extends (Int, String)(key, value) 

: nesne yönelimli bir dil, bu nedenle bir tuple uzmanlaşmak konusunda ikinci ilişkin, sihirli kelime miras olduğunu. Sınıfın bir vücuda bile ihtiyacı yoktur.

val kvp = KeyValue(42, "Hello") 
kvp._1 // => res0: Int = 42 
kvp.value // => res1: String = "Hello" 

Bununla birlikte, (Tuple2 olan) örnek sınıfları devralan, kaldırıldı ve ileride izin edilebilir. Burada yukarıdaki sınıf tanımı için olsun uyarı derleyici var:

uyarı: vaka sınıfı class KV vaka sınıf atası class Tuple2 sahiptir. Bu, hem kullanımı hem de uygulamayı gereksiz yere karmaşıklaştırdığı için kullanımdan kaldırılmıştır. Bunun yerine yapraksız düğümlerde desen eşleşmesi için ekstraktör kullanmalısınız.

18

Tür diğer adı, Tuple adlandırma için iyidir, ancak bunun yerine bir sınıf sınıfı kullanmayı deneyin. Sen

Örnek tuple ile adlandırılmış parametreleri kullanmak mümkün olacak: Bir vaka sınıfında ile

def foo(a : Int) : (Int, String) = { 
    (a,"bar") 
} 
val res = foo(1) 
val size = res._1 
val name= res._2 

:

case class Result(size : Int , name : String) 
def foo(a : Int) : Result = { 
    Result(a,"bar") 
} 
val res = foo(1) 
val size = res.size 
val name= res.name 
+0

tuples hızlı durumunda daha çalışmayın: bir demet dönen bir yöntem Verilen

val (first, second) = incrementPair(3, 4) println(s"$first ... $second") 

: ne yapabileceğini lokalize senaryolar için Ancak

kod okunabilirliği artırmak için tuple extractor kullanmaktır sınıflar? Görev, büyük miktarlarda basit verilerin karmaşık bir şekilde işlenmesi, bir çeşit sayı-çatırdamadır. – Ivan

+6

@Ivan: Tuples * * vaka sınıfları, değil mi? –

+4

Tupleler gerçekten örnek derslerdir! –

4

İşte tip takma ad ve fabrika nesnesi yaratan bir çözümdür.

scala> type T = (Int, String)       
defined type alias T 

scala> object T { def apply(i: Int, s: String): T = (i, s) } 
defined module T 

scala> new T(1, "a") 
res0: (Int, String) = (1,a) 

scala> T(1, "a") 
res1: (Int, String) = (1,a) 

Ancak, başkalarının da belirttiği gibi, muhtemelen bir vaka sınıfı oluşturmanız gerekir. Diğerleri söyledikleri gibi, genel anlamda en iyi (açık) sınıflar en iyisi olmakla birlikte,

0

.

def incrementPair(pair: (Int, Int)) : (Int, Int) = { 
    val (first, second) = pair 
    (first + 1, second + 1) 
} 
İlgili konular