Scala的傳值呼叫與傳名呼叫理解

2021-10-16 02:30:09 字數 1224 閱讀 7919

通常函式/方法的引數是傳值引數,也就是說,引數的值在傳遞給函式之前已經確定好了。而在scala中,方法或函式的引數可以是乙個表示式,也就是可以將乙個**邏輯傳遞給某個方法或著函式。(這有點像c語言)

1.scala的傳值呼叫(call-by-value),引數是乙個或多個型別的變數

2.scala的傳名呼叫(call-by-name),引數傳的是函式/方法名,即函式/方法(一段邏輯)

object callbynameandvalue 

//數數每次扣完剩多少錢

def shuqian():int=

//方法printbyvalue的引數是乙個int型別的變數

def printbyvalue(x:int)=元")

}} //方法printbyname的引數是乙個無參,返回值為int型別的函式(x: => int 表示的是乙個方法的簽名)

def printbyname(x: => int)=元")//該方法無返回值,直接在方法體輸出結果

}} def main(args: array[string]): unit =

}

//傳值呼叫

測試: 95元

測試: 95元

測試: 95元

//傳名呼叫

每次都算算還剩: 95元

每次都算算還剩: 90元

每次都算算還剩: 85元

每次都算算還剩: 80元

再看乙個:

object calculate 

//定義乙個函式,有2個int型別引數,且返回值為引數相乘結果

val fa:(int,int)=>int=(a,b)=>a*b

//add1方法有2個引數:第乙個引數是擁有乙個int型別、返回值為int的函式

//可以不寫返回值型別,編譯器可自動推測

def add1(c:int =>int,d:int)=

//定義乙個擁有1個引數的函式

// val c:int=>int=e=>e*5

val c=(e:int)=>e*5

def main(args: array[string]): unit =

}

scala 傳值呼叫,傳名呼叫

scala的直譯器在解析函式引數 function arguments 時有兩種方式 在進入函式內部前,傳值呼叫方式就已經將引數表示式的值計算完畢,而傳名呼叫是在函式內部進行引數表示式的值計算的。這就造成了一種現象,每次使用傳名呼叫時,直譯器都會計算一次表示式的值。傳名呼叫時,接受表示式的形參定義一...

Scala 傳值呼叫和傳名呼叫

傳值呼叫時,引數只在呼叫時計算一次,後續重複使用計算的結果 傳名呼叫時,引數在呼叫時不會計算,只有真正用到引數的時候才會計算 x int object scalafunction def printbyname x int unit def printbyvalue x int unit def m...

傳值呼叫和傳名呼叫

共用 傳值呼叫和傳名呼叫 var money 100 定義乙個花錢的方法 花錢 def buy unit 查詢 def see 當傳入引數為乙個具體的數值時,引數的值一旦確定,就不會改變。def value x int unit value see 執行結果 money 95 money 95 mo...