亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在Scala中按名稱調用與按值調用,需要澄清

在Scala中按名稱調用與按值調用,需要澄清

嚕嚕噠 2019-07-22 10:43:41
在Scala中按名稱調用與按值調用,需要澄清據我所知,在Scala中,函數可以被稱為按價值或有名無實例如,給定以下聲明,我們知道如何調用該函數嗎?聲明:def  f (x:Int, y:Int) = x;打電話f (1,2)f (23+55,5)f (12+3, 44*11)請問有什么規定?
查看完整描述

3 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

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

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

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

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

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

現在,當我們用我們的副作用函數調用它們時,會發生什么呢?

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

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

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


查看完整回答
反對 回復 2019-07-22
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

以下是MartinOdersky的一個例子:

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

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

test (2,3)

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

test (3+4,8)

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

test (7,2*4)

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

test (3+4, 2*4)

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


查看完整回答
反對 回復 2019-07-22
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

我認為最好把“逐名”看作是語法糖。解析器只是將表達式封裝在匿名函數中,以便在以后使用時調用它們。

實際上,而不是定義

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-22
  • 3 回答
  • 0 關注
  • 543 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號