2013-03-16 2 views
1

1) Как называется эта конструкция? Не удается Google.метод преобразования в функцию?

2) Почему это не работает? Я ожидаю, что сообщение будет напечатано.

class A { 
    def m() { 
    println("m()") 
    } 
} 

object Main { 

    def main(args: Array[String]) { 
    val fun = (_: A).m _ 
    fun(new A()) 
    } 

} 
+2

Это называется * частично применяется функция *, пожалуйста, см http://blog.sanaulla.info/2010/12/25/partially-applied -functions-in-scala/для деталей –

+0

Это для меня новое: '(_: A) .m' – sourcedelica

+0

' (_: A) .m' '' A => Unit' и '(_: A) .m _' is 'A => (() => Unit)' – sourcedelica

ответ

1

Как отмечает om-nom-nom, преобразование методов в функции называется «частичным применением». Он может быть явно выражен, используя символы подчеркивания (s) как «аргументы» для метода или автоматически компилятором, когда доступной информации типа достаточно для того, чтобы сделать вывод о том, что имя метода, используемое в месте, где требуется функция, может быть частично применяется для получения требуемой функции.

Теперь для вашего кода. Как написано, результатом вызова fun(new A()) является Function1[Unit, Unit]. Вы должны были бы apply, которые функционируют, чтобы получить println вызывается

// Exiting paste mode, now interpreting. 

defined class A 
defined module Main 

scala> Main.main(Array()) 

scala> def doIt { val fun = (_: A).m _; fun(new A())() } 
doIt: Unit 

scala> doIt 
m() 
Смежные вопросы