2011-07-09 4 views
7

Par exemple voir les éléments suivantsEst-il possible d'initialiser des objets Scala sans utiliser "new"?

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

Le code utilise

val oneHalf = new Rational(1, 2) 

est-il un moyen de faire quelque chose comme

val oneHalf: Rational = 1/2 
+0

Je sais que votre exemple est juste pseudocode mais je l'aime! Afin de faire ce travail, on surchargerait l'opérateur/sur Ints pour renvoyer des objets rationnels au lieu de Ints. Ce serait intéressant! –

Répondre

7

Je recommanderais d'utiliser un autre opérateur (par exemple \) pour votre Rational littéral, comme / est déjà défini sur tous les types numériques comme une opération de division.

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'en est-il de '÷' ('\ u00f7')? Autrement, il semble que 2 soit supérieur à 1. – huynhjl

5

Je vais voler la réponse de MissingFaktor, mais changez-la légèrement.

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) 
    } 
} 

Ensuite, vous pouvez faire quelque chose comme ça, que je pense est un peu plus agréable que d'utiliser la barre oblique inverse, et plus cohérente puisque vous voulez définir tous les opérateurs numériques habituels sur Rational de toute façon:

scala> 1.r/2 
res0: Rational = Rational(1,2) 
Questions connexes