Iterable<T>
Javaや C#に相当する Scala を実装するにはIEnumerable<T>
? 基本的に、コレクションをマップ可能、フィルター可能などにしたいのですが、コレクションクラスを拡張する必要がある特性と、列挙子を作成する簡単な方法 (yield return
およびyield break
C# のようなもの) はありますか?
6872 次
3 に答える
14
Iterable
特性を実装します。必要なのはiterator
メソッドだけです。他のすべてのメソッド ( map
、filter
など) は無料です。
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 に答える