2016-07-28 53 views
1

我感興趣的知道,如果在Scala中的部分功能可以接受多個參數設置爲變換,如是否有可能通過scala中的部分函數傳遞多個參數來返回某些內容?

val test: PartialFunction[Int, Boolean, String] = { case d: Int if d > 0 => "one" } 

test(0, true) 

在這裏,我想在一個int和一個布爾值傳遞,因此它可以重新評估它成一個字符串,這可能嗎?

+1

一種選擇是使用元組'(Int,Boolean)'。 – alextsc

回答

1

正如在評論中提到@alextsc,使用元組作爲函數的輸入類型:

val test: PartialFunction[(Int, Boolean), String] = { 
    case (d, b) if (d > 0) && b => "one" 
} 

test((0, true)) // or test(0 -> true) 

您可以縮放這出(幾乎)通過使用更高的元數元組類型的任何數量的參數:

val test4: PartialFunction[(A, B, C, D), String] = { 
    case (a, b, c, d) => s"$a, $b, $c, $d" 
} 
test4((new A, new B, new C, new D)) 
+0

你不需要額外的括號。 '測試(...)'工作正常。 – jwvh

+0

@jwvh這是真的,但我選擇在我的示例中留下額外的圓括號,以強調我們正在傳遞一個元組,而不是傳遞2個(或4個)單個參數。 – Dylan

+1

@jwvh auto-tupling將來會被棄用並帶走。 – wheaties

1

如果您看一下PartialFunction的用途,那就沒有任何意義。基本上,你在比賽用語中隱含地使用了Parital。 正如@Dylan所述,您已經可以使用Tuple類型,或者您可以使用某種類型的案例類,這對於PartialFunctions來說非常重要。

case class Func3[A,B,C](x:A, y:B, z:C) 

val p:PartialFunction[Func3[Int, Int, Int], String] = { 
    case Func3(a, b, c) => (a+b+c).toString 
} 

p(Func3(1,2,3)) 

根據這個例子,Tuple會更有意義。但也許它會讓你的應用程序的設計受益。

相關問題