2012-12-03 12 views
10

किसी भी कारण से (जो मुझे बचता है) स्केल math लाइब्रेरी में pow नहीं है - पूर्णांक के लिए फ़ंक्शन नहीं है, लेकिन केवल Double एस के लिए है।स्कैला

मुझे पूर्णांक के लिए एक वर्ग समारोह की आवश्यकता है और यह पता लगा रहा था कि स्कैला में ऐसा करने का सामान्य तरीका क्या हो सकता है।

object TestX extends App { 

    def pow2(v: Int)= v*v 

    //class MyRichInt(val v: Int) { 
    // def ² : Int = v*v  // says: "illegal character" for UTF-8 power-of-two 
    //} 

    println(pow2(42)) 
    //println(42²) 
    println(math.pow(42,2).toInt) 
} 

मुझे आश्चर्य हुआ कि '²' चरित्र स्कैला द्वारा पसंद नहीं किया जाता है। शायद यह एक संख्या के लिए लिया गया है? आमतौर पर अजीब यूनिकोड मानों के सभी प्रकार मान्य होते हैं और कोड में 42 वर्ग का उपयोग करके वास्तव में फैंसी होगी।

कोई बात नहीं। क्या मुझे बंद करना चाहिए और बस अपना खुद का pow2 फ़ंक्शन का उपयोग शुरू करना चाहिए?

+0

मैं डॉन आपको नहीं लगता कि आप जानते हैं कि दो की शक्ति वास्तव में क्या है: https://en.wikipedia.org/wiki/Power_of_two –

+0

तो सच है। तदनुसार शीर्षक और पाठ को दोहराया। धन्यवाद। – akauppi

उत्तर

24

हां, अपने pow2 का उपयोग करें। यदि आपको उच्च शक्तियों की आवश्यकता है, तो संभवतः आपके पास Int में कोई कमरा नहीं होगा। , अगर आप एन लेकिन 2 एन की जरूरत नहीं है, बस की पाली का उपयोग

scala> BigInt(40).pow(40) 
res0: scala.math.BigInt = 12089258196146291747061760000000000000000000000000000000000000000 
बेशक

: BigInt.pow उपयोग पर विचार करें। (1 << k = 2 के) ये काम BigInt के साथ भी काम करते हैं। मनमाना प्रकार पर आपरेशन जोड़ने के लिए यूनिकोड वर्ण के लिए

15

बैकटिक उपयोग, आंतरिक वर्गों (स्काला 2.10):

implicit class PowerInt(i: Int) { 
    def `²`: Int = i * i 
} 

उपयोग:

3 `²` 

परिणाम:

9 
+3

ग्रेट। लेकिन वास्तव में इस का उपयोग करने की नीचता को पतला कर देता है। हालांकि अच्छा बिंदु। :) – akauppi

+0

मुझे आश्चर्य है कि पार्सर/लेक्सर को बैकटिक्स की आवश्यकता क्यों है। –