2014-06-20 182 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的语法糖)。 –