11.5. Częściowe wywołanie metody lub funkcji
Metodę można „częściowo wywołać”, czyli wywołać z pominięciem niektórych argumentów. Pominięte argumenty zastępowane są znakiem podkreślenia. Tak „częściowo wywołana” metoda w rzeczywistości nie jest wywoływana, ale jest zamieniana na funkcję. Poniższe polecenie zamienia metodę greet, ze zdefiniowanego w pliku Functions6.scala obiektu Greeting, na funkcję dwuargumentową, której działanie odpowiada wywołaniu metody greet z łańcuchem znaków „Hi” w pierwszym parametrze.
scala> :load Functions6.scala
Loading Functions6.scala...
greet: (greeting: String, name: String, surname: String)String
scala> val hi: (String,String) => String = greet("Hi",_,_)
hi: (String, String) => String = <function2>
scala> hi("John","Brown")
res0: String = Hi John Brown!
scala> greet("Hi","John","Brown")
res1: String = Hi John Brown!
Pominięcie deklaracji typu funkcji jest nieprawidłowe i powoduje wystąpienie błędu.
scala> val hi2 = greet("Hi",_,_)
<console>:11: error: missing parameter type for expanded function ((x$1, x$2) => greet("Hi", x$1, x$2))
val hi2 = greet("Hi",_,_)
^
<console>:11: error: missing parameter type for expanded function ((x$1: <error>, x$2) => greet("Hi", x$1, x$2))
val hi2 = greet("Hi",_,_)
^
Typ parametrów tworzonej funkcji można określić w inny sposób, dodając adnotacje typu do znaków podkreślenia, jak w poniższym przykładzie.
scala> val hi3 = greet("Hi",_:String,_:String)
hi3: (String, String) => String = <function2>
scala> hi3("John","Brown")
res2: String = Hi John Brown!
Częściowe wywołanie można zastosować nie tylko w przypadku metod, ale również w przypadku funkcji. Poniższy przykład pokazuje najpierw przekształcenie metody greet na funkcję greetFun z trzema parametrami, a następnie przekształcenie tej funkcji na funkcję z dwoma parametrami, poprzez jej częściowe wywołanie.
scala> val greetFun = greet _
greetFun: (String, String, String) => String = <function3>
scala> val hi4 = greetFun("Hi",_:String, _:String)
hi4: (String, String) => String = <function2>
scala> hi4("John","Brown")
res3: String = Hi John Brown!
