Revision 1 as of 2011-10-24 02:27:43

Clear message
Locked History Actions

scala/ByNameParamter

名前渡しパラメータ

基本

引数の定義時に「=>」をつけると名前渡しパラメータになる。どのようなものかは以下を参照

object Sample {

  def foo = {
    println("foo")
    123
  }
  
  /** 値渡し */
  def byValue(a: Int) = {
    println("byValue entry")
    val r = a + a
    println("byValue exit")
    r
  }
  
  /** 名前渡し */
  def byName(a: => Int) = { // =>をつけてるだけ
    println("byName entry")
    val r = a + a
    println("byName exit")
    r
  }
  
  def main(args: Array[String]) {
    println(byValue(foo))
    println("")
    println(byName(foo))
  }
}

この実行結果は

foo
byValue entry
byValue exit
246

byName entry
foo
foo
byName exit
246

両方ともfooを引数として渡しているが、

  • 値渡しの場合は、評価された後の値が渡されており、その時にfooが一度だけ呼び出されている。
  • 名前渡しの場合は、渡されるときには評価されず、必要なときに何度もfooが呼び出されている。