2014-06-20 54 views
0

參數語法糖我有操作有點語法糖,一個物體上取決於:有斯卡拉

case class EllipticOperand (p : Point) 
{ 
    def + (q : => Point) = curve.sum(p,q) 
    def * (n : => BigInt) = curve.times(p,n) 
} 
implicit def PointToOperand(p : Point) = EllipticOperand(p) 

case class EllipticMultiplier (n : BigInt) 
{ 
def * (p : => Point) = curve.times(p,n) 
} 
implicit def BigIntToOperand (n : BigInt) = EllipticMultiplier(n) 

我想在一些class SyntacticSugar[Point](curve : main.Curve[Point])封裝在其他類定義來使用它,而無需拷貝/粘貼它。

我試圖用這種方式:

val sugar = new util.SyntacticSugar(curve) 
import sugar._ 

然而,這是不行的,以後我不能用+*

+1

爲什麼不特質,你會混入其他班級? –

+0

問題是,'特性'不支持參數,我的語法糖每次都取決於特定的曲線。 謝謝你的方式。 –

+0

您定義了類'SyntacticSugar',像這樣:'class SyntacticSugar [Point](curve:main.Curve [Point])'?所以上面de代碼片段中的'Point'不是一個類,而是一個類型參數? –

回答

4

如果我實現它,你認爲它只是工作,你可以在Point使用+*作爲運營商的方式......

case class Point(x: Int, y: Int) 

trait Curve[T] { 
    def sum(p: T, q: T): T 
    def times(p: T, n: Int): T 
} 

// dummy implementation 
class PointCurve extends Curve[Point] { 
    override def sum(p: Point, q: Point) = Point(p.x+q.x, p.y+q.y) 
    override def times(p: Point, n: Int) = Point(p.x*n, p.y*n) 
} 


object util { 
    class SyntacticSugar[T](curve: Curve[T]){ 
    case class EllipticOperand(p: T){ 
     def +(q: =>T) = curve.sum(p, q) 
     def *(n: =>Int) = curve.times(p,n) 
    } 
    implicit def point2Operand(p: T) = EllipticOperand(p) 
    } 
} 

現在:

scala> val sugar = new util.SyntacticSugar(new PointCurve) 
sugar: util.SyntacticSugar[Point] = [email protected] 

scala> import sugar._ 
import sugar._ 

scala> Point(1,2) + Point(2,3) 
res0: Point = Point(3,5) 

scala> Point(1,2) * 3 
res1: Point = Point(3,6) 
+0

它不適用於我,是因爲它在不同的文件?如果是這樣,這是一個問題,因爲我不會把所有的課程放在同一個班級。 –

+0

不應該有必要將所有類都放在同一個文件中。只有'SyntacticSugar','EllipticOperand'和'point2Operand'方法必須位於同一個文件中,因爲'SyntacticSugar'是另外兩個的封閉類。 你會得到什麼樣的錯誤?在哪些代碼行? –

+0

我得到'重載的方法值*替代(...)不能應用於(點)a * p'其中'a'是一個BigInt和一個點。 (我在第一條消息中添加了BigInt的語法糖)。 –