10

Iterable<T>Javaや C#に相当する Scala を実装するにはIEnumerable<T>? 基本的に、コレクションをマップ可能、フィルター可能などにしたいのですが、コレクションクラスを拡張する必要がある特性と、列挙子を作成する簡単な方法 (yield returnおよびyield breakC# のようなもの) はありますか?

4

3 に答える 3

14

Iterable特性を実装します。必要なのはiteratorメソッドだけです。他のすべてのメソッド ( mapfilterなど) は無料です。

class MyIterable[T](xs: Vector[T]) extends Iterable[T] { 
  override def iterator = xs.iterator 
}

val a = new MyIterable(Vector(1,2,3))
a.map(_+1) // res0: Iterable[Int] = List(2, 3, 4)
a.filter(_%2==1) // res1: Iterable[Int] = List(1, 3)
于 2013-10-23T21:22:50.477 に答える
0

scala.collection.Iterableかなり包括的で強力な特性またはその不変バージョンを使用できます。それが役立つことを願っています。

于 2013-10-23T21:19:14.987 に答える
0

列挙子に関しては、Scala には Enumeration がありますが、sealed traits + 派生クラスを使用する方がより柔軟なようです。たとえば、次のようになります。

sealed trait MyEnum {
  lazy val value = 0
}
case object MyEnumA extends MyEnum {
  override lazy val value = 1
}
case object MyEnumB extends MyEnum {
  override lazy val value = 2
}

scala> val a = MyEnumB
a: MyEnumB.type = MyEnumB

scala> a.value
res24: Int = 2

scala>  val l = List(MyEnumA,MyEnumB)
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB)

scala> l.map(_.value)
res29: List[Int] = List(1, 2)

これらのオブジェクトを文字列表現以外にマッピングすることを気にしない場合は、内部構造なしでこれらのオブジェクトを使用することもできます。

sealed trait MyEnum
case object MyEnumA extends MyEnum
case object MyEnumB extends MyEnum

scala> val a = MyEnumA
a: MyEnumA.type = MyEnumA

scala> a.toString
res21: String = MyEnumA

scala> val l = List(MyEnumA,MyEnumB)
l: List[Product with Serializable with MyEnum] = List(MyEnumA, MyEnumB)

scala> l.map(_.toString)
res30: List[String] = List(MyEnumA, MyEnumB)
于 2013-10-23T21:28:48.957 に答える