2011-07-09 9 views
7

Por ejemplo, véase la siguiente¿Hay alguna forma de inicializar objetos de Scala sin usar "nuevo"?

http://www.artima.com/pins1ed/functional-objects.html

el código utiliza

val oneHalf = new Rational(1, 2) 

¿Hay una manera de hacer algo como

val oneHalf: Rational = 1/2 
+0

Sé que su ejemplo es solo un seudocódigo, ¡pero me gusta! Para que funcione, se sobrecargaría el operador/en Ints para devolver objetos Rational en lugar de Ints. ¡Eso puede ser interesante! –

Respuesta

7

Yo recomendaría el uso de algún otro operador (por ejemplo \) para su literal Rational, como / ya está definido en todos los tipos numéricos como una operación de división.

scala> case class Rational(num: Int, den: Int) { 
    | override def toString = num + " \\ " + den 
    | } 
defined class Rational 

scala> implicit def rationalLiteral(num: Int) = new { 
    | def \(den: Int) = Rational(num, den) 
    | } 
rationalLiteral: (num: Int)java.lang.Object{def \(den: Int): Rational} 

scala> val oneHalf = 1 \ 2 
oneHalf: Rational = 1 \ 2 
+1

¿Qué tal '' ('('\ u00f7')? De lo contrario, hace que parezca que 2 es más de 1. – huynhjl

5

Voy a robar la respuesta de MissingFaktor, pero la cambio ligeramente.

case class Rational(num: Int, den: Int) { 
    def /(d2: Int) = Rational(num, den * d2)  
} 

object Rational { 
    implicit def rationalWhole(num: Int) = new { 
    def r = Rational(num, 1) 
    } 
} 

entonces usted puede hacer algo como esto, que creo que es un poco mejor que el uso de la barra invertida, y más consistente ya que se le quiere definir todos los operadores numéricos habituales en racional de todos modos:

scala> 1.r/2 
res0: Rational = Rational(1,2) 
Cuestiones relacionadas