nish1013
nish1013

Reputation: 3728

function parameters with and without () in Scala

I am playing around with code examples related to Scala in Action book http://www.manning.com/raychaudhuri/

Quoting from https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala

// Run with >scala LoopTill.scala  or
// run with the REPL in chap01/ via
// scala> :load LoopTill.scala

object LoopTillExample extends App {
  def loopTill(cond: => Boolean)(body: => Unit): Unit = {
    if (cond) { 
      body
      loopTill(cond)(body)     
    }
  }

  var i = 10   
  loopTill (i > 0) {     
     println(i)
     i -= 1   
  }   
}

In above code cond: => Boolean is where I am confused. When I changed it to cond:() => Boolean it failed.

Could someone explain me what is the different between

cond: => Boolean 

and

cond:() => Boolean 

Aren't they both represent params for function ?

Upvotes: 6

Views: 170

Answers (1)

Nicolas Rinaudo
Nicolas Rinaudo

Reputation: 6168

I'm by no means a scala expert, so take my answer with a heavy grain of salt.

The first one, cond: => Boolean, is a by-name parameter. To keep things simple, it's essentially syntactic sugar for a function of arity 0 - it's a function, but you handle it as a variable.

The second one, cond: () => Boolean, is an explicit function parameter - when you reference it without adding parameters, you're not actually calling the function, you're referencing it. In your code, if(cond) can't work: a function cannot be used as a boolean. It's return value can be, of course, which is why you need to explicitely evaluate it (if(cond())).

There's a wealth of documentation about by-name parameters, a very powerful feature in Scala, but as far as I understand it, it can just be considered syntactic sugar.

Upvotes: 7

Related Questions