pass-by-value: expressions as arguments to a function are evaluated once on passing to the function
pass-by-name: expressions are evaluated only when referenced, if they are not referenced they are not evaluated, and the expression is evaluated every time the expression is referenced
System.out.println("Calling squareCallByValue(): ") squareCallByValue( doSomething() ) System.out.println("nCalling squareCallByName(): ") squareCallByName( doSomething() ) System.out.println("nCalling callByNameNoReference(): ") callByNameNoReference( doSomething() )
def doSomething() : Int = { System.out.println("doSomething() called") 2 } def squareCallByName(x: => Int) = { var result = x * x System.out.println("x in squareCallByName: " + result) } def callByNameNoReference(x: => Int) = { } def squareCallByValue(x: Int) = { var result = x * x System.out.println("x in squareCallByValue: " + result) }