는이 두 가지 정의가 매개 변수로 "SSS"를 받아 다음스칼라 - 타입 T의 매개 변수 또는 => T
def foo(s: String) = { ... }
및
def foo(s: => String) { ... }
사이에 어떤 차이가 있나요.
는이 두 가지 정의가 매개 변수로 "SSS"를 받아 다음스칼라 - 타입 T의 매개 변수 또는 => T
def foo(s: String) = { ... }
및
def foo(s: => String) { ... }
사이에 어떤 차이가 있나요.
인수가 String
인 경우 by-value 매개 변수 인 경우 => String
은 by-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)
하지만
=> 이름으로 값
=> "참조로"가 아닌 "이름으로"의미합니다. –
죄송합니다. 방금 답변을 편집했습니다. 나는 가치/참고를 지나가는 것에 대한 또 다른 질문에 답을하고 머리 속에 쓰고있었습니다. – jcern
그들은 동일하지 않습니다. 그들은 서로 다른 두 가지입니다. –
에 의해
첫 번째 패스이 당신을 위해 재미있을 수도를 전달합니다 : HTTP : // 유래 .com/a/4545703/298389 –
두 함수 모두에 중괄호 앞에 '='기호를 넣으시겠습니까? 아래의 해답은 이것을 가정합니다. 중요한 차이점은 있지만 별도의 토론을위한 문제입니다. –