第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Scala中按名稱調(diào)用與按值調(diào)用,需要澄清

在Scala中按名稱調(diào)用與按值調(diào)用,需要澄清

小唯快跑啊 2019-07-26 15:14:14
在Scala中按名稱調(diào)用與按值調(diào)用,需要澄清據(jù)我所知,在Scala中,函數(shù)可以被稱為按價值或有名無實例如,給定以下聲明,我們知道如何調(diào)用該函數(shù)嗎?聲明:def  f (x:Int, y:Int) = x;打電話f (1,2)f (23+55,5)f (12+3, 44*11)請問有什么規(guī)定?
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

您給出的示例只使用了按值調(diào)用,所以我將給出一個新的、更簡單的示例,它顯示了不同之處。

首先,假設我們有一個有副作用的函數(shù)。此函數(shù)輸出一些內(nèi)容,然后返回Int.

def something() = {
  println("calling something")
  1 // return value}

現(xiàn)在我們將定義兩個接受Int參數(shù)完全相同的參數(shù),但以按值調(diào)用的方式接受參數(shù)(x: Int)和另一個按名字調(diào)用的方式(x: => Int).

def callByValue(x: Int) = {
  println("x1=" + x)
  println("x2=" + x)}def callByName(x: => Int) = {
  println("x1=" + x)
  println("x2=" + x)}

現(xiàn)在,當我們用我們的副作用函數(shù)調(diào)用它們時,會發(fā)生什么呢?

scala> callByValue(something())calling something
x1=1x2=1scala> callByName(something())calling something
x1=1calling something
x2=1

因此您可以看到,在按值調(diào)用版本中,傳入函數(shù)調(diào)用的副作用(something()只發(fā)生過一次。然而,在點名版中,副作用發(fā)生了兩次.

這是因為按值調(diào)用函數(shù)在調(diào)用函數(shù)之前計算傳入表達式的值,因此值每次都會被訪問。但是,按名調(diào)用函數(shù)。重算每次訪問傳入表達式的值。




查看完整回答
反對 回復 2019-07-27
?
qq_花開花謝_0

TA貢獻1835條經(jīng)驗 獲得超7個贊

以下是MartinOdersky的一個例子:

def test (x:Int, y: Int)= x*x

我們希望檢查評估策略,并確定在這些條件下哪種策略更快(步驟更少):

test (2,3)

按值調(diào)用:測試(2,3)->2*2->4
按姓名呼叫:test(2,3)->2*2->4
在這里,用相同數(shù)目的步驟達到結(jié)果。

test (3+4,8)

按值調(diào)用:測試(7,8)->7*7->49
點名:(3+4)(3+4) -> 7(3+4)-> 7*7 ->49
在這里,按值調(diào)用更快。

test (7,2*4)

按值調(diào)用:測試(7,8)->7*7->49
點名:7*7->49
在這里按名字叫更快

test (3+4, 2*4)

按值調(diào)用:test(7,2*4)->test(7,8)->7*7->49
點名:(3+4)(3+4) -> 7(3+4) -> 7*7 -> 49
結(jié)果在相同的步驟中達到。



查看完整回答
反對 回復 2019-07-27
?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

要在上面的評論中迭代@Ben的觀點,我認為最好把“逐名”看作是語法糖。解析器只是將表達式封裝在匿名函數(shù)中,以便在以后使用時調(diào)用它們。

實際上,而不是定義

def callByName(x: => Int) = {
  println("x1=" + x)
  println("x2=" + x)}

和跑步:

scala> callByName(something())calling something
x1=1calling something
x2=1

你也可以寫:

def callAlsoByName(x: () => Int) = {
  println("x1=" + x())
  println("x2=" + x())}

并按以下方式運行,效果相同:

callAlsoByName(() => {something()})calling something
x1=1calling something
x2=1

 


查看完整回答
反對 回復 2019-07-27
  • 3 回答
  • 0 關(guān)注
  • 612 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號