Suchen Sie zum Beispiel vom Typ Klasse Verwendung, die in Scala 2.7.7 und 2.8 Skripte funktionieren

StackOverflow https://stackoverflow.com/questions/4426815

Frage

Hallo, ich bin auf der Suche nach einem schnellen Beispiel Typklasse Verwendung in Scala, die in beiden 2.7.7 und 2.8-Umgebungen arbeiten.

Alle Beispiele, dass ich nur die Arbeit in 2.8 gesehen habe, aber ich habe gehört, dass Typklassen implementierbar sind in 2.7.7 als auch.

Die einzige andere Anforderung ist, dass die Nutzung der Arbeit in einem Skript in der Lage sein muss.

Alle Beispiele zu schätzen! Dank

War es hilfreich?

Lösung 2

Ich ging mit einer Lösung in diese Richtung:

//---------- Classes without needed behavior
case class Point(x: Double, y: Double)
trait Shape {}
case class Circle(center: Point, radius: Double) extends Shape {}
case class Rectangle(lowerLeft: Point, upperRight: Point) extends Shape {}


val circle = Circle(Point(1.0, 2.0), 5.0)
val rectangle = Rectangle(Point(-2.0, -1.0), Point(4.0, 5.0))


//----------- Support for new behavior I want to add

// Create exception to handle non supported subclasses
case class NewMethodNotSupported(a: Any)
    extends RuntimeException(a.toString + ".newMethod() not supported")

class NewBehavior(shape: Shape) {
    def newMethod() = shape match {
        case c: Circle => doMethod(c)
        case r: Rectangle => doMethod(r)
        case _ => throw NewMethodNotSupported(shape)
    }
    private
    def doMethod(s: Shape) = println(s) // print to standard out.
}

object NewBehavior {
    // invoked by the compiler
    implicit def shapeToNewBehavior(s: Shape) = new NewBehavior(s)
}

// bring the implicit method in scope
import NewBehavior._
// --------- End of new behavior support        


// Test behavior support:
println("Test that new behavior is added:")
circle.newMethod()
rectangle.newMethod()

// Create a non supported shape class
case class Triangle(vertex1: Point,
        vertex2: Point, vertex3: Point) extends Shape {}

val triangle = Triangle(Point(-1.0,0.0), Point(1.0,0.0), Point(0.0,1.0))

// Catch exception thrown by trying to call method from unsupported shape
try{    
    println("\nTest method call from unsupported shape:")
    triangle.newMethod()
} catch {
    case dns: NewMethodNotSupported => println(dns); System.exit(-1)
    case unknown => println("Uknown exception " + unknown); System.exit(-1)
}

Andere Tipps

Ich nehme an, Sie so etwas tun könnte:

def max[A](list: List[A])(implicit ord: Ordering[A]): A = {
  list.tail.foldLeft(list.head) ((a, b) => if (ord.lt(a, b)) b else a)
}

implicit def toOrdering[A <% Ordered[A]]: Ordering[A] = new Ordering[A] {
    def compare(a: A, b: A): Int = (a < b, b < a) match {
        case (true, _) => -1
        case (_, true) => 1
        case _ => 0
    }
}

println(max(List(1, 2, 3, 2, 1)))

Der Code läuft sowohl in der Scala 2.7.7 und 2.8.0 (jetzt in beide getestet), obwohl die implizite Definition ist nicht notwendig (und möglicherweise schädliche in manchen Situationen) in Scala 2.8.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top