6

Scala in Action book http://www.manning.com/raychaudhuri/に関連するコード例をいじっています。

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   
  }   
}

上記のコードcond: => Booleanでは、私が混乱しているところです。に変更しcond:() => Booleanたら失敗しました。

誰かが私に何が違うのか説明してもらえますか

cond: => Boolean 

cond:() => Boolean 

どちらも関数のパラメーターを表していませんか?

4

1 に答える 1

7

私は決して scala の専門家ではないので、私の回答は大雑把に聞いてください。

最初のcond: => Booleanは、名前によるパラメーターです。簡単にするために、これは基本的にアリティ 0 の関数のシンタックス シュガーです。これは関数ですが、変数として扱います。

2 番目のcond: () => Booleanは、明示的な関数パラメーターです。パラメーターを追加せずに参照すると、実際には関数を呼び出しているのではなく、参照していることになります。あなたのコードでif(cond)は、機能しません: 関数はブール値として使用できません。もちろん、戻り値は次のようになります。そのため、明示的に評価する必要があります(if(cond()))。

Scala の非常に強力な機能である by-name パラメーターに関するドキュメントは豊富にありますが、私が理解している限りでは、それは単にシンタックス シュガーと見なすことができます。

于 2013-09-04T08:41:40.343 に答える