2011-07-09 21 views
7

Na przykład zobaczyć następującyCzy istnieje sposób inicjalizacji obiektów Scala bez użycia "nowego"?

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

Kod wykorzystuje

val oneHalf = new Rational(1, 2) 

Czy istnieje sposób, aby zrobić coś podobnego

val oneHalf: Rational = 1/2 
+0

Wiem, że twój przykład to tylko pseudokod, ale mi się podoba! Aby wykonać tę pracę, należałoby przeciążyć operatora/na Ints, aby zwrócić obiekty Rational zamiast Ints. To byłoby interesujące! –

Odpowiedz

7

Polecam przy użyciu innego operatora (słownie \) dla Twojej literówki Rational, jako / jest już zdefiniowane dla wszystkich typów liczbowych jako operacja dzielenia.

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

Co powiecie na '÷' ('\ u00f7')? W przeciwnym razie \ sprawia, że ​​2 oznacza więcej niż 1. – huynhjl

5

Mam zamiar ukraść odpowiedź MissingFaktor, ale nieco ją zmienić.

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

Następnie można zrobić coś takiego, co moim zdaniem jest trochę ładniejszy niż stosując odwrotny ukośnik i bardziej spójne, ponieważ będziemy chcieli określić wszystkie standardowe operatory numeryczne na racjonalnych i tak:

scala> 1.r/2 
res0: Rational = Rational(1,2) 
Powiązane problemy