This is an excerpt from my much longer blog post, How to Use By-Name Parameters in Scala.
“By-name” parameters — also known as call-by-name parameters — are quite different than by-value parameters. Rob Norris, (aka, “tpolecat”) makes the observation that you can think about the two types of parameters like this:
- A by-value parameter is like receiving a
val
field; its body is evaluated once, when the parameter is bound to the function. - A by-name parameter is like receiving a
def
method; its body is evaluated whenever it is used inside the function.
Those statements aren’t 100% accurate, but they are decent analogies to start with. The important part of this analogy is that a by-name parameter is like a def in that nothing happens with that parameter until you reference it inside your method. (More on this shortly.)
Another definition of by-name parameters
A little more accurately, the book Scala Puzzlers says that by-name parameters are “evaluated only when they are referenced inside the function.” The Scala Language Specification adds this:
This (by-name) indicates that the argument is not evaluated at the point of function application, but instead is evaluated at each use within the function.
Other possible names for by-name parameters
According to Wikipedia these terms date back to a language named ALGOL 60 (yes, the year 1960). But for me, the term “by-name” isn’t very helpful. I honestly don’t know what it’s supposed to mean.
When you look at those quotes from the Puzzlers book and the Language Specification, you see that they both say, “a by-name parameter is only evaluated when it’s accessed inside a function.” Given that definition, and tpolecat’s definition up above, I find that the following names are more accurate and meaningful than “by-name”:
- Call on access
- Evaluate on access
- Evaluate on use
- Evaluate when accessed
- Evaluate when referenced
However, because I can’t change the universe, I’ll continue to use the terms “by-name” and “call by-name” in this lesson, but I wanted to share those alternate names, which I think are more meaningful.