Scalaの Pythonのスライス表記 に似たものはありますか?
これは本当に便利な操作であり、すべての言語に組み込む必要があると思います。
scala> import collection.IterableLike
import collection.IterableLike
scala> implicit def pythonicSlice[A, Repr](coll: IterableLike[A, Repr]) = new {
| def apply(subrange: (Int, Int)): Repr = coll.slice(subrange._1, subrange._2)
| }
pythonicSlice: [A,Repr](coll: scala.collection.IterableLike[A,Repr])Java.lang.Object{def apply(subrange: (Int, Int)): Repr}
scala> val list = List(3, 4, 11, 78, 3, 9)
list: List[Int] = List(3, 4, 11, 78, 3, 9)
scala> list(2 -> 5)
res4: List[Int] = List(11, 78, 3)
これでいいですか?
免責事項:適切に一般化されていません。
編集:
scala> case class PRange(start: Int, end: Int, step: Int = 1)
defined class PRange
scala> implicit def intWithTildyArrow(i: Int) = new {
| def ~>(j: Int) = PRange(i, j)
| }
intWithTildyArrow: (i: Int)Java.lang.Object{def ~>(j: Int): PRange}
scala> implicit def prangeWithTildyArrow(p: PRange) = new {
| def ~>(step: Int) = p.copy(step = step)
| }
prangeWithTildyArrow: (p: PRange)Java.lang.Object{def ~>(step: Int): PRange}
scala> implicit def pSlice[A](coll: List[A]) = new {
| def apply(prange: PRange) = {
| import prange._
| coll.slice(start, end).grouped(step).toList.map(_.head)
| }
| }
pSlice: [A](coll: List[A])Java.lang.Object{def apply(prange: PRange): List[A]}
scala> val xs = List.range(1, 10)
xs: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> xs(3 ~> 9)
res32: List[Int] = List(4, 5, 6, 7, 8, 9)
scala> xs(3 ~> 9 ~> 2)
res33: List[Int] = List(4, 6, 8)
Scala(構文が少し異なります)の同等のメソッドは、すべての種類のシーケンスに存在します。
scala> "Hello world" slice(0,4)
res0: String = Hell
scala> (1 to 10) slice(3,5)
res1: scala.collection.immutable.Range = Range(4, 5)
Pythonでのスライスと比較した最大の違いは、Scalaでは開始インデックスと終了インデックスが必須であるということです。
ここではScalaAPI を参照してください
したがって、同じ表記上の利便性ではありませんが、操作はそこにあります
defスライス(from:Int、until:Int):Seq [A]
要素の間隔を選択します。
要素の間隔を選択します。
注:c.slice(from、to)は、c.drop(from).take(to --from)と同等です(ただし、おそらくより効率的です)。
このシーケンスで最初に返された要素のインデックスから。このシーケンスで最後に返された要素を1つ超えたインデックスまで。
戻り値
このシーケンスのインデックスから始まり、インデックスまで(ただしインデックスを含まない)まで拡張する要素を含むシーケンス。
定義クラス:IterableLike→TraversableLike
これはapply
を使用しても完全には機能しないことに注意してください。ただし、リスト、文字列、配列などに対して一般化:
implicit def it2sl[Repr <% scala.collection.IterableLike[_, Repr]](cc: Repr) = new {
def ~>(i : Int, j : Int) : Repr = cc.slice(i,j)
}
使用法は次のとおりです。
scala> "Hello World" ~> (3, 5)
res1: Java.lang.String = lo
scala> List(1, 2, 3, 4) ~> (0, 2)
res2: List[Int] = List(1, 2)
scala> Array('a', 'b', 'c', 'd') ~> (1, 3)
res3: Array[Char] = Array(b, c)
メソッドの名前を、気になる別の名前に変更することをお勧めします。 例外apply
(String
からStringLike
への変換がすでに行われているため、apply
メソッドで文字列を装飾します-同様にArrayOps
-そしてList
などの他のコレクションタイプにはすでにapplyメソッドがあります)。
ビューバウンドを使用するためのヒントを提供してくれたDanielに感謝します。