2017-07-18 11 views
0

スカラでは、Vector2Dというクラスがあり、それに対して暗黙の変換を行いたいと思います。現在、私はこの機能をVector2Dに入れています:implicit def fromFloatTuple(tuple: (Float, Float)): Vector2D = new Vector2D(tuple._1, tuple._2)スカラの暗黙関数による呼び出し関数

私は以下をうまくいくことができますval x: Vector2D = (1f, 1f)。しかし、私はval x: Float = (1f, 1f).length()のようなことはできません(明らかにVector2Dの長さが定義されています)。なぜこれは機能しません、私はそれがval x: Float = fromFloatTuple((1f, 1f)).length()のようなものに変換されることを期待しますが、そうではありません。 Scalaでこの効果をどうやって得るのですか?

また、私はこの関数が他の数値型も受け入れるようにするにはどうすればいいですか?すべての数値型の組み合わせごとに関数を作成しないでください(2Dベクトルの問題ではなく4Dベクトル)。

答えて

-1

This is exactly how it is supposed to work:あなたはscala.math.Numericで見たいと思うかもしれませんより一般的なケースでは

import scala.language.implicitConversions 

object Test { 
    class Vector2D(x: Float, y: Float) { def length(): Float = x + y } 

    implicit def fromFloatTuple(tuple: (Float, Float)): Vector2D = Vector2D(tuple._1, tuple._2) 

    val x: Float = (1f, 1f).length() 

case class Vector4D[N](a: N, b: N, c: N, d: N)(implicit n: Numeric[N]) { 
    import n._ 

    def length(): N = a + b + c + d 
    } 

    implicit def c2V4D[N: Numeric](tup: (N, N, N, N)): Vector4D[N] = new Vector4D(tup._1, tup._2, tup._3, tup._4) 

    println(Vector4D(1,2,3,4).length()) 
    println(Vector4D(1,2,3,4.5).length()) 
    println((1,2,3,4).length()) 
} 
+0

このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 16747601) – stevieb

+0

フィードバックに感謝します! –

+0

異なる数値型であるため、 '(1f、1)'のような場合は失敗します。回避策は複数の汎用引数を宣言することです。 –

1

あなたがターゲットまたはソースタイプVector2Dを持っている場合、コンパイラはVector2Dのコンパニオンオブジェクトを検索します。 val x: Float = (1f, 1f).length()にはありません。暗黙の変換の可能なすべての型を探すことは、コンパイルを非常に遅くし、Scalaコンパイラはすでに遅いです(しかし改善しています)。

あなたはそれをインポートすることにより、スコープにfromFloatTupleを持参する必要があります。

import your.package.Vector2D._ // or just fromFloatTuple instead of _ 
関連する問題