2013-08-31 4 views
10

मैं इस कोड है:स्केला, एक समारोह के तर्क के रूप में एक ऑपरेटर पासिंग

for(i <- 0 to 8){ 
    ((numbers(i) - i)/3).abs + ((numbers(i) - i)%3).abs 
} 

और मैं, करना चाहते हैं, के रूप में शीर्षक कहते हैं इस

for(i <- 0 to 8){ 
    by3(numbers(i), i, /) + by3(numbers(i), i, %) 
} 

def by3(a: Int, b: Int, op: Int => Int) = ((a - b) op 3).abs 

और शायद भी तरह कुछ इसके लिए आंशिक रूप से लागू फ़ंक्शन का उपयोग करें .. लेकिन अब तक यह हासिल करना संभव होगा? कैसे?

उत्तर

8

अंडरस्कोर आप मूल्यों के रूप में कार्य करता है परिभाषित करने की जरूरत से छुटकारा पाने के।

val/= (a:Int, b: Int) => a/b 
val % = (a:Int, b: Int) => a % b 

def by3(a: Int, b: Int, fn: (Int, Int) => Int): Int = fn(a - b, 3).abs 

(0 to 8).foreach(i => by3(numbers(i), i, /) + by3(numbers(i), i, %)) 
+0

यह वही है जो मैं पूछ रहा था, धन्यवाद :) – LowFieldTheory

+1

भाषा के कितने लचीलेपन के दृष्टिकोण से ठंडा है, लेकिन एक कोड रखरखाव परिप्रेक्ष्य से काफी अस्पष्ट है। मैं इसे कोडबेस में नहीं जाने दूंगा। – maasg

6

संपादित/अपडेट:

संक्षिप्त होने के नाते, यह करने के लिए सबसे छोटा रास्ता है:

def doStuff(a: Int, b: Int, op: (Int, Int) => Int) = {op(a - b, 3).abs}

doStuff(4,1,_%_)

तो आप कर सकते हैं doStuff(numbers(i), i, _/_) + doStuff(numbers(i), i, _ % _)

+2

केवल एक चीज - यह वास्तव में वर्बोज़ है। मैं केवल एक ऑपरेटर के लिए बहुत से अक्षरों को डुप्लिकेट नहीं करने के लिए कुछ छोटे फ़ंक्शन खोज रहा था, और स्कैला को जानना मुझे लगभग यकीन था कि मैं केवल% या/में फ़ंक्शन में पास कर सकता हूं। यह वास्तव में मेरे प्रश्न का आधा जवाब है, मैं सीधे एक ऑपरेटर में पास करने के लिए एक विधि खोज रहा था, दो रैपर फ़ंक्शन नहीं बना रहा था। – LowFieldTheory

+0

@Novalink, कृपया मेरे अपडेट को देखें। – tkroman

+0

ओह, मैंने जवाब संपादित किया और फिर देखा कि @maasg पहले ही समाधान पोस्ट कर चुका है। Buzz के लिए खेद है। – tkroman

16

सबसे पहले, आप op को सही ढंग से परिभाषित करने की आवश्यकता है एक समारोह के रूप (विशेष रूप से, एक Function2)

def operate(a: Int, b: Int, op: (Int, Int) => Int) : Int = (op ((a - b), 3)).abs

स्काला में ऑपरेटरों वास्तव में तरीके हैं: + स्काला OO नींव में इंट (और लांग, डबल, ...) का एक तरीका है। फिर, एक समारोह के रूप में एक ऑपरेटर (विधि) पारित करने के लिए, आप इसे अंडरस्कोर अंकन का उपयोग उठा सकते हैं: operate(5, 3, _ + _)

संबंधित मुद्दे