2017-07-29 3 views
0

"評価"の意味を理解しようとしています。"評価"の意味

名前で呼び出すことについて学び、Scalaの価値を呼び出すと、評価の意味について混乱します。コンパイラが自分のコードを理解するために実行するものなのでしょうか、メソッドの実際の呼び出しの前にメソッドの実行/検証のようなものでしょうか?

評価方法以外は明確な説明がありませんでした。

次の例の評価を教えてください。

def callByValue(x : Unit) = { 
    for (i <- 0 until 5) { 
     print(x) 
    } 
    } 

    def callByName(x : => Unit) = { 
    for (i <- 0 until 5) { 
     print(x) 
    } 
    } 
+0

https://tpolecat.github.io/2014/06/26/call-by-name.html – danielnixon

答えて

1

もっと簡単な例を考えてみましょう。

def callByValue(x : Unit) = if (1 > 0)() else x 
def callByName(x : => Unit) = if (1 > 0)() else x 

1 > 0はそうどちらの方法でも、これまでx値を返すことができ、常にtrue、当然のことながら、あることに注意してください。

ここでそれらを呼びましょう。

callByValue(println("Value")) // res0: Unit =() 
callByName(println("Name")) // res1: Unit =() 

両方のコールタイプUnitの唯一の値である、()を返すが、最初の、callByValue()、副作用を有します。 STDOUTに "Value"という語を表示します。 「名前」という単語は印刷されません。何故ですか?

callByValue()に渡される引数がと評価されたため、メソッドが呼び出されたときにと評価されました。 callByName()の引数は、xという引数が参照されるまで評価されませんが、ifの条件が常にtrueであり、else句が実行されず、xが評価されないため参照されません。

0

.. "評価"の意味...コンパイラが自分のコードを理解するために何かしているのですか、実際にメソッドを呼び出す前にメソッドを実行/検証していますか?

評価方法の違いを例示する多くの良い例があります。 @jwvhによって与えられたもの。この件に関してはwikipediaの記事もあります。

あなたは「評価」という言葉に混乱しているようです。おそらく、コンパイラではなくインタプリタを考える方が簡単でしょう。通訳者は、プログラムを実行しています。と評価されており、と評価されています。例えば、Pythonには組み込み関数(そして "exec" btw)が付属しています。

「評価戦略は」インタプリタは、実際のパラメータ値を返しますコードを評価/実行するために起こっているかときを意味します。

コンパイルされたプログラムの場合、実行可能コードを生成するときに、コンパイラがこの決定を行うことを除いて(実際にはプログラマが関数を定義したときを除いて)同じです。