2012-08-16 3 views
3

는이 두 가지 정의가 매개 변수로 "SSS"를 받아 다음스칼라 - 타입 T의 매개 변수 또는 => T

def foo(s: String) = { ... } 

def foo(s: => String) { ... } 

사이에 어떤 차이가 있나요.

+3

에 의해

첫 번째 패스이 당신을 위해 재미있을 수도를 전달합니다 : HTTP : // 유래 .com/a/4545703/298389 –

+0

두 함수 모두에 중괄호 앞에 '='기호를 넣으시겠습니까? 아래의 해답은 이것을 가정합니다. 중요한 차이점은 있지만 별도의 토론을위한 문제입니다. –

답변

17

인수가 String 인 경우 by-value 매개 변수 인 경우 => Stringby-name 매개 변수입니다. 첫 번째 경우에는 문자열이 전달되고 두 번째 경우에는 thunk인데 이 사용되면 a String으로 계산됩니다.

def stringGen: String = util.Random.nextInt().toString 

def byValue(s: String) = 
    println("We have a '" + s + "' and a '" + s + "'") 

def byName(s: => String) = 
    println("We have a '" + s + "' and a '" + s + "'") 

byValue(stringGen) // constant value 
byName (stringGen) // evaluated twice 

는 종종에 의해 이름 매개 변수는 여러 번 평가하는 데 사용되지 않지만 에 게으르게은 한 번 평가합니다. 그들은 같은 많은 경우

def logMessage = { 
    println("Calculating log message...") 
    new java.util.Date().toString 
} 

def log(enabled: Boolean, message: => String): Unit = { 
    lazy val fullMessage = "LOG: " + message 
    println("Test") 
    if (enabled) println(fullMessage) 
} 

log(false, logMessage) 
log(true , logMessage) 
2

하지만

=> 이름으로 값

+1

=> "참조로"가 아닌 "이름으로"의미합니다. –

+0

죄송합니다. 방금 답변을 편집했습니다. 나는 가치/참고를 지나가는 것에 대한 또 다른 질문에 답을하고 머리 속에 쓰고있었습니다. – jcern

+0

그들은 동일하지 않습니다. 그들은 서로 다른 두 가지입니다. –