2016-08-22 1 views
0

スカラを学習してベースベクトルクラスを拡張するのに問題があります。コンストラクタシグネチャを見回しましたが、ドキュメントを解析できませんでした。誰も私に以下のコードを書く正しい方法を教えてもらえますか? (エラーチェック不要)scala baseベクトルコンストラクタを拡張する

class VD(x: Vector) extends Vector(x){ 
     def +(that: VD) = that.foreach{ case (e,i) => that(i)+this(i)} 
     } 
<console>:12: error: constructor Vector in class Vector cannot be accessed in object $iw 

ありがとう!

+0

[ドキュメントを読む](http://www.scala-lang.org/api/current/#scala.collection.immutable.Vector$)、詳細が必要な場合は、[sourceコード](https://github.com/scala/scala/blob/v2.11.8/src/library/scala/collection/immutable/Vector.scala#L1)。リンクは各ページの上部にあります。 – jwvh

+0

あなたの回答と指導をありがとう、彼らは大きな助けです – Iodizer

答えて

3

これを行う1つの方法は、"rich wrapper"です。これは、Scala自体が広範に基本タイプを拡張するために使用します。暗黙的な変換は、Scala Vectorから、追加するメソッドを含む独自のクラス(ここではMyVector)に行われます。その後、そのメソッドは平文Vectorを返します。

class MyVector[T](val underlying: Vector[T]) { 
    def +(that: Vector[T])(implicit x: scala.math.Numeric[T]): Vector[T] = { 
    import x._ 
    underlying.zip(that).map { 
     case (a,b) => a + b 
    } 
    } 
} 

object MyVector { 
    implicit def toMyVector[T](that: Vector[T]): MyVector[T] = new MyVector(that) 
} 

import MyVector._ 

val a = Vector(1, 2, 3) 
val b = Vector(4, 5, 6) 
val c = a + b 

出力:

a: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) 
b: scala.collection.immutable.Vector[Int] = Vector(4, 5, 6) 
c: Vector[Int] = Vector(5, 7, 9) 

+機能におけるジェネリックパラメータTの追加を許可するように、いくつかのmagicを使用しています。

EDIT:コメントで指摘したように

、別の最適化がimplicit classを使用して、コンパニオンオブジェクトを省略することです。さらに別の最適化は、value classにすることです。

object VectorStuff { 
    implicit class MyVector[T](val underlying: Vector[T]) extends AnyVal { 
    def +(that: Vector[T])(implicit x: scala.math.Numeric[T]): Vector[T] = { 
     import x._ 
     underlying.zip(that).map { 
     case (a, b) => a + b 
     } 
    } 
    } 
} 

そして次にimport VectorStuff._です。

+2

「暗黙のクラス」の構文は、定型文を減らすのに役立ちます。したがって、暗黙のクラスMyVector [T](valの基底:Vector [T]){...}。 – dveim

1

ベクトルは最終クラスです。それは拡張することはできません。

+0

あなたのソースへのリンクを提供できますか? – davidrpugh

+0

ソース(@jwvhによってリンクされている) 'final class Vector [+ A] private [不変] ... ' –

関連する問題