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!

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.