2016-04-02 9 views
0

に特定のマップ・メソッドを追加するだから私はVEC2クラスを持っている:はコレクション/ファンクタ

class Vec2(val x: Double, val y: Double) 
{ 
    def +(other: Vec2): Vec2 = Vec2(x + other.x, y + other.y) 
    def -(other: Vec2): Vec2 = Vec2(x - other.x, y - other.y) 
    def *(factor: Double): Vec2 = Vec2(x * factor, y * factor) 
    def /(divisor: Double): Vec2 = Vec2(x/divisor, y/divisor) 
    //Other methods omitted but you get the idea 
} 

私は、このクラスをたくさん使用して、私はそれをコレクションにたくさん使うので、私は.MAPための短い手の方法を希望します(2番目の:Vec2、factor:Double)とmultAddAll(factor:Double、second:Vec2)のメソッドを追加したいと思っています。明示的な方法として。

私は暗黙のうちにトラバーサルクラスを選択しました。これは私が使うことができる最高の/最も一般的なクラスですか?私はscalaのソースコードからmapメソッドを浮き沈みして修正しました。以下のコードは正しいですか?問題なく動作しますか?

object Vec2 
{ 
    import collection.mutable.{ Builder } 
    import scala.collection._ 
    implicit class ImpVec2Class[+Repr](travLike: TraversableLike[Vec2, Repr]) 
    { 
    def +++ [That](offset: Vec2)(implicit bf: generic.CanBuildFrom[Repr, Vec2, That]): That = 
    { 
     def builder = 
     { // extracted to keep method size under 35 bytes, so that it can be JIT-inlined 
      val b = bf(travLike.repr) 
      b.sizeHint(travLike) 
      b 
     } 
     val b = builder 
     for (x <- travLike) b += x + offset 
     b.result 
    } 
    } 
} 

は私が短縮方法をしたい場合はダブルのマップ・メソッドのためにこれを行う必要があり、またはScalaz/CATSは、すでにそれらを含めるんですか?

答えて

0

OKこれを少し改良して回答として投稿します。メソッドの[型]パラメータを削除しました。また、ArrayはScalaコレクションの特性を継承しないため、Array [Vec2]のインプリメンテーションを追加しました。

object Vec2 
{ 
    import collection.mutable.{ Builder } 
    import scala.collection._ 
    implicit class ImpVec2Traversible[Repr](travLike: TraversableLike[Vec2, Repr]) 
    { 
    def +++ (offset: Vec2)(implicit bf: generic.CanBuildFrom[Repr, Vec2, Repr]): Repr = 
    { 
    def builder = 
    { // extracted to keep method size under 35 bytes, so that it can be JIT-inlined 
     val b = bf(travLike.repr) 
     b.sizeHint(travLike) 
     b 
    } 
    val b = builder 
    for (x <- travLike) b += x + offset 
    b.result 
    } 
} 
    implicit class ImpVec2Array(arr: Array[Vec2]) 
    { 
    def +++ (offset: Vec2): Array[Vec2] = arr.map(_ + offset) 
    } 
}