2010-07-13 2 views
9

Предположит, у меня есть простой класс в Scala:Как я могу получить объекты Function из методов в Scala?

class Simple { 
    def doit(a: String): Int = 42 
} 

Как я могу хранить в Вале Function2 [Simple, String, Int], который принимает два аргумента (целевой простой объект, аргумент строки), и может вызвать doit() вернуть мне результат?

ответ

14
val f: Function2[Simple, String, Int] = _.doit(_) 
+1

Вызывается «частичное приложение». Как показывают здесь, это особый случай. Как следует из названия, некоторые аргументы могут предоставляться в частичном приложении, а результирующая функция имеет arity N-M, где N - арность исходного (или функционального) исходного метода, а M - количество аргументов, зафиксированных в частичном приложении. –

+0

Отлично. Мне было интересно, как компилятор выяснит, действительно ли метод doit существует; Я вижу, что явное написание делает трюк здесь. Благодаря! –

12

же, как sepp2k, просто используя другой синтаксис

val f = (s:Simple, str:String) => s.doit(str) 
9

Для тех из вас, которые не пользуются печатаете типов:

scala> val f = (_: Simple).doit _ 
f: (Simple) => (String) => Int = <function1> 

Читает метод по _ работ для для любого arty:

scala> trait Complex {       
    | def doit(a: String, b: Int): Boolean 
    | }          
defined trait Complex 

scala> val f = (_: Complex).doit _    
f: (Complex) => (String, Int) => Boolean = <function1> 

Это подпадает под действие §6.23 «Синтаксис синтаксиса для анонимных функций» и §7.1 «Значения метода» для Scala Reference

+0

Каковы практические последствия наличия функции типа (Simple) => (String) => Int против типа (Simple, String) => Int? Я знаю, что первое вызвано с f (obj) («str»), а второе с f (obj, «str»), а первое возвращает другой объект функции, если просто вызвать его с одним списком параметров: f (obj). Но что происходит за кулисами с точки зрения количества созданных объектов и количества вызовов методов? –

+0

Созданы два объекта Function1, а не один объект Function2 с дополнительным уровнем косвенности. – retronym

Смежные вопросы