[英]How to slice a tuple in scala
我正在嘗試切片一個元組,刪除最后兩個項目。 我嘗試使用list drop / take方法,但我無法成功獲得元組。
這是我嘗試的方法:
scala> val myTuple = (1, 2, 4, 5, 0, 5)
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5)
scala> val myList = myTuple.productIterator.toList
myList: List[Any] = List(1, 2, 4, 5, 0, 5)
scala> val mySubList = myList.dropRight(2)
mySubList: List[Any] = List(1, 2, 4, 5)
scala> val mySubTuple = ???
我在這里看到,在scala中,元組的列表不是(但是?)。
是否有其他方法可以獲得該子組(不處理myTuple._1,myTuple._2 ...)?
這是無形的可以通用的方式做的事情,涉及轉換為HList
。
首先 - 變得沒型 。 然后運行scala並打開依賴方法類型 (默認情況下在2.10中打開 ):
C:\Scala\sdk\scala-2.9.2\bin>scala -Ydependent-method-types
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04).
Type in expressions to have them evaluated.
Type :help for more information.
在classpath中添加shapeless:
scala> :cp C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar
Added 'C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar'. Your new classpath is:
"C:\tibco\tibrv\8.2\lib\tibrvnative.jar;C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar"
現在讓我們玩吧!
scala> (1, 2.3, 'a, 'b', "c", true)
res0: (Int, Double, Symbol, Char, java.lang.String, Boolean) = (1,2.3,'a,b,c,true)
我們必須進口無形
scala> import shapeless._; import Tuples._; import Nat._
import shapeless._
import Tuples._
import Nat._
我們將元組轉換為HList
scala> res0.hlisted
res2: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char,shapeless.::[java.lang.String,shapeless.::[Boolean,shapeless.HNil]]]]]] = 1 :: 2.3 :: 'a :: b :: c :: true :: HNil
然后我們取第4個(注意_4
是一個類型參數, 而不是方法參數 )
scala> res2.take[_4]
res4: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char, shapeless.HNil]]]] = 1 :: 2.3 :: 'a :: b :: HNil
現在轉換回元組
scala> res4.tupled
res5: (Int, Double, Symbol, Char) = (1,2.3,'a,b)
我們可以縮短這個:
val (a, b, c, d) = sixtuple.hlisted.take[_4].tupled
//a, b, c and d would all have the correct inferred type
這當然推廣到N
元組的前M
元素
scala> val myTuple = (1, 2, 4, 5, 0, 5)
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5)
scala> myTuple match {
| case (a, b, c, d, _, _) => (a, b, c, d)
| }
res0: (Int, Int, Int, Int) = (1,2,4,5)
怎么樣:
scala> val myTuple = (1,2,4,5,0,5) myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5) scala> val (left,right):Tuple2[List[Int],List[Int]] = myTuple.productIterator.toList.splitAt(myTuple.productArity - 2) left: List[Int] = List(1, 2, 4, 5) right: List[Int] = List(0, 5) scala> val mytuple2 = (right(0),right(1)) mytuple2: (Int, Int) = (0,5)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.