2013-08-31 64 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

只是一件事 - 這是非常冗長的。我正在尋找一些小功能,以避免僅爲一個操作員複製很多charachters,並且知道scala我幾乎可以確定我可以傳遞函數%或/。這實際上是對我的問題的一半答覆,我正在尋找一種方法直接傳入一個運算符,而不是創建兩個包裝函數。 – LowFieldTheory

+0

@Novalink,請看我的更新。 – tkroman

+0

哦,我編輯了答案,然後注意到@maasg已經發布瞭解決方案。嗡嗡聲對不起。 – tkroman

16

首先,需要正確定義op作爲一個功能(具體來講,Function2

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

運營商在斯卡拉實際上方式:+是INT(和龍,雙,...)的斯卡拉OO基礎的方法。然後,爲了傳遞一個運算符(方法)作爲函數,可以使用下劃線表示法: operate(5, 3, _ + _)

相關問題