2013-11-09 3 views
1

Я узнал, что параметры и функции по-имени очень похожи. В чем преимущество первых против второго?Параметры или функции по имени?

object ws1 { 
    def myByFunc(f:() => Int) = f()    //> myByFunc: (f:() => Int)Int 
    def myByName(f: => Int) = f      //> myByName: (f: => Int)Int 

    def testFunc(a: Int) = a * a     //> testFunc: (a: Int)Int 

    myByFunc(() => testFunc(123))     //> res0: Int = 15129 
    myByName(testFunc(123))       //> res1: Int = 15129 

} 

UPDATE: Что касается вопроса о том, сколько раз каждый из них выполняет:

object ws1 { 
    def myByFunc(f:() => Int) = { 
    println("111111111 myByFunc") 
    f() 
    }            //> myByFunc: (f:() => Int)Int 

    def myByName(f: => Int) = { 
    println("22222222 myByName") 
    f 
    }            //> myByName: (f: => Int)Int 

    def testFunc(a: Int) = a * a     //> testFunc: (a: Int)Int 

    myByFunc(() => testFunc(123))     //> 111111111 myByFunc 
                //| res0: Int = 15129 
    myByName(testFunc(123))       //> 22222222 myByName 
                //| res1: Int = 15129 
} 

По какой-то причине они оба выполняют 1 раз. Зачем?

UPDATE2: Ни один из них оценивается:

object ws1 { 
    def myByFunc(f:() => Int) = { 
    println("111111111 myByFunc") 
    }            //> myByFunc: (f:() => Int)Unit 

    def myByName(f: => Int) = { 
    println("22222222 myByName") 
    }            //> myByName: (f: => Int)Unit 

    def testFunc(a: Int) = { 
    println("hello from test func") 
    123456 
    }            //> testFunc: (a: Int)Int 

    myByFunc(() => testFunc(123))     //> 111111111 myByFunc 
    myByName(testFunc(123))       //> 22222222 myByName 
} 

ответ

0

Это кажется похож, но цель другая:

  • () => Int является функцией, точнее Function0: это не принимать параметры и возвращать Int. Выполнение функции функции инициируется вызовом функции f().

  • => Int является параметром, принятый с вызова по имени методики: оценки будет лней. Код никогда не может быть оценен: def myByName(f: => Int) = 1 или может быть оценен несколько раз: def myByName(f: => Int) = f * f.

Для более полного объяснения, взгляните на этот вопрос: What's the difference between => ,()=>, and Unit=>

+0

не '() => Int' ленивым? не будет ли '() => Int' выполняться несколько раз? –

+0

'() => Int' не ленив, это призыв к значению. Значение сначала будет вычислено и передано 'myByFunc' –

+0

, а что касается второго вопроса? –

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