2017-07-29 59 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,當然,總是true所以這些方法都不能夠再回到該x值。

現在讓我們打電話給他們。

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)。

「評估戰略」是指如何解釋是要執行/評估,將返回的實際參數值的代碼。

對於已編譯的程序,除了編譯器在生成可執行代碼時作出此決定(實際上是程序員在定義函數時做出的決定)之外,它與其相同。