1

私は Scala の初心者で、無知なことをお許しください。

これは、理解するのが少し奇妙であるスニペットです。

def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)

times(5){ println("index") }

出力は次のとおりです。インデックスは一度だけ印刷されます。

ただし、これは次のとおりです。

def times(n: Int) = (0 until n) foreach(n=>println("index"))

10回印刷します。

4

3 に答える 3

3
def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)

メソッドは、 を受け取って返すtimes関数を作成します。UnitUnit

times(5)を取るUnitのでtimes(5){ println("index") }、そのパラメータprintln("index")を に評価しますUnit

時間を評価println("index") nするには、次のように関数として渡す必要があります。

def times(n: Int) = (body: Unit => Unit) => (0 until n) foreach(_ => body())

使用法:

times(5){ _ => println("index") }

parameter groupsandを使用する方が良いかもしれませんpass by name

def times(n: Int)(body: => Unit) { (0 until n) foreach( _ => body) }

使用法:

scala> times(5){ println("index") }
index
index
index
index
index
于 2013-02-14T13:44:31.293 に答える
2

2 番目の関数は期待どおりに動作するはずです。

ただし、最初の関数のタイプが間違っています。正しくするには、次のようにする必要があります。

def times(n: Int)(body: => Unit) = (0 until n) foreach(n=>body)

それ以外の場合、意味は次のとおりです。(あなたの機能:)

def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)

呼び出すと、パラメーターとして受け取って実行されるaがtimes(n)返されますfunctionUnit(0 until n) foreach(n => body)

于 2013-02-14T13:40:04.087 に答える
1

Unit最初は「コードのブロック」を意味すると考える傾向がありますが、これはまったく正しくありません。Unit1 つの値があります: (). それでおしまい。

bodyしたがって、あなたがするときtimes(5){ println("index") }の価値はではなく{ println("index") }、 になります()。5回やっても()5回は何も起きない。

{ println("index") }が実行され、何かが出力され、返さUnitれて に割り当てられbodyます。このような:

scala> val body = { println("index") }
index
body: Unit = ()

scala> (0 until 5) foreach {n => body}

scala>

名前によるパラメーターを使用して、必要なことを行うことができます。この場合、パラメーターは、単に ではなく、 に評価される式をUnitUnit表します。例えば:

def times(n: Int)(body: => Unit) = (0 until n) foreach(n=>body)

パラメータ タイプの=>プレフィックスは、パラメータが名前で渡されることを意味します。タイプを変更するのではなく、評価戦略を変更します(詳細については、リンクを参照してください)。

于 2013-02-14T15:10:14.627 に答える