2013-11-03 26 views
7

pow için ** sözdizimini çok seviyorum (Python gibi).Scala için `` `güç operatörü oluşturma?

Scala 'base' kodunu değiştirmeden Scala'ya tanıtmak mümkün mü? Bir Int de

girişimim tek:

import scala.math.pow 
implicit class PowerInt(i: Int) { 
    def `**`(n: Int, b: Int): Int = pow(n, b).intValue 
} 

(o IDEone üzerine başarısız bakınız) Bu benim için çalışıyor

+7

Not 'o **' ne '^' sağ öncelik (nedeni bu olmaz neden stdlib içermez). '4 * 5 ** 3'' (4 * 5) ** 3' değil '4 * (5 ** 3)' dır. – sschaef

+0

Scala, ayrıştırma yöntemlerini LL olmayan (1) dilbilgisine değiştirebilir; örn .: C++ 'nun nasıl birden fazla'> ''

cevap

11

: (Sorun 1. pow sorun 2. uzanan anyval, çiftlerde tanımlanır) (aynı zamanda hiçbir nokta methodName bu komutu ters tırnak sahip olmanın vardır?)

import scala.math.pow 

object RichIntt { 

    implicit class PowerInt(val i:Double) extends AnyVal { 
    def ** (exp:Double):Double = pow(i,exp) 
    } 

    def main(args:Array[String]) 
    { 
    println(5**6) 
    } 

} 
+1

Bu oldukça havalıdır. –

12

Bu cevap hala fo, 2 yıl gecikti Diğerlerinin yararı Kabul edilen cevabın, AnyVal'den gereksiz yere uzandığını belirtmek isterim.

Sadece orijinal yanıtta düzeltilmesi gereken küçük bir hata var. def ** yönteminin yalnızca bir parametresine, yani temelin yapıcıda zaten geçirilmiş olduğu ve orijinal koddaki gibi değil, iki parametresi olması gerekir. O Tespit ve backticks Sonuçlar kaldırılırken: here görüldüğü gibi beklendiği gibi çalıştığını

import scala.math.pow 
implicit class PowerInt(i: Int) { 
    def ** (b: Int): Int = pow(i, b).intValue 
} 

. Üzerinde denir yöntem tanımsız ise

Scala derleyici bir Int sadecePowerInt bir artığını edecektir. Bu yüzden AnyVal'den uzamanıza gerek yok.

Scala, sahnelerin arkasında, kurucu argümanı türü, atanan nesnenin türü ile aynı olan örtülü bir sınıf arar. Nesnenin yalnızca bir türü olabileceğinden, örtük sınıfların yapıcılarında birden fazla bağımsız değişkeni olamaz. Üstelik, aynı yapıcı türüne sahip iki örtük sınıf tanımlarsanız, işlevlerinin benzersiz imzalara sahip olduğundan emin olun, aksi takdirde Scala, hangi sınıfın belirleyici olacağını ve belirsizlik hakkında şikayette bulunacağını bilmez.

1

Numeric typeclass kullanarak biraz daha genel bir çözüm yapmak için bir yol yoktur:

implicit class PowerOp[T: Numeric](value: T) { 
    import Numeric.Implicits._ 
    import scala.math.pow 

    def **(power: T): Double = pow(value.toDouble(), power.toDouble()) 
}