日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
講解一下Scalamethod和function的區(qū)別和聯(lián)系

本篇文章重點為大家講解一下Scala method和 function的區(qū)別和聯(lián)系,有需要的小伙伴可以參考一下。

專業(yè)領(lǐng)域包括成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、成都商城網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

如何定義

首先,還是引用英文原文來看看他們在定義上的區(qū)別和聯(lián)系吧:

A Function Type is (roughly) a type of the form (T1, …, Tn) => U, which is a shorthand for the trait FunctionN in the standard library. Anonymous Functions and Method Values have function types, and function types can be used as part of value, variable and function declarations and definitions. In fact, it can be part of a method type.

A Method Type is a non-value type. That means there is no value – no object, no instance – with a method type. As mentioned above, a Method Value actually has a Function Type. A method type is a def declaration – everything about a def except its body.

例子:

scala> def m1(x:Int) = x+3
m1: (x: Int)Int    

scala> val f1 = (x: Int) => x+3
f1: Int => Int = 
  

看到?jīng)],方法定義和函數(shù)定義是不是在scala的解析器signature上就有顯示了,def m1(x: Int) = x+3就是一個簡單的method的定義。signature中m1: (x: Int)Int 表示method m1有一個參數(shù)Int型參數(shù)x,返回值是Int型。

val f1 = (x: Int) => x+3則是function的定義,解析器的signature中f1: Int => Int = 表示function f1的method體接受一個Int型的參數(shù),輸出結(jié)果的類型是Int型。

從上面的例子,得出一個總結(jié):

方法是一個以def開頭的帶有參數(shù)列表(可以無參數(shù)列表)的一個邏輯操作塊,這正如object或者class中的成員方法一樣。

函數(shù)是一個賦值給一個變量(或者常量)的匿名方法(帶或者不帶參數(shù)列表),并且通過=>轉(zhuǎn)換符號跟上邏輯代碼塊的一個表達式。=>轉(zhuǎn)換符號后面的邏輯代碼塊的寫法與method的body部分相同。

其他區(qū)別

method 可以作為一個表達式的一部分出現(xiàn)(調(diào)用函數(shù)并傳參),但是 method(帶參方法)不能作為最終的表達式(無參方法可以,但是這個就成了方法調(diào)用,因為 scala 允許無參方法調(diào)用時省略()括號),而 function 可以作為最終的表達式出現(xiàn)。

scala> m1

  
   :12: error: missing arguments 
   for method m1; follow this method with `_
   ' if you want to treat it as a partially applied function       m1       ^ scala> f1 res1: Int => Int =  
  

method 可以沒有參數(shù)列表,參數(shù)列表也可以為空。但是 function 必須有參數(shù)列表(也可以為空)。方法名意味著方法調(diào)用,函數(shù)名只是代表函數(shù)自身:

scala> def m2 = 100;
m2: Int

scala> def m3() = 1000;
m3: ()Int

scala> var f2 = => 100;

  
   :1: error: illegal start of simple expression var f2 = => 100;         ^ scala> var f2 =()=> 100; f2: () => Int = 
   
     scala> m2 res2: Int = 100 scala> m3 res3: Int = 1000 scala> m3() res4: Int = 1000 scala> f2 res5: () => Int = 
    
      scala> f2() res6: Int = 100 
    
   
  

在函數(shù)出現(xiàn)的地方我們可以提供一個方法。

這是因為,如果期望出現(xiàn)函數(shù)的地方我們提供了一個方法的話,該方法就會自動被轉(zhuǎn)換成函數(shù)。該行為被稱為 ETA expansion。

注意:

期望出現(xiàn)函數(shù)的地方,我們可以使用方法。

不期望出現(xiàn)函數(shù)的地方,方法并不會自動轉(zhuǎn)換成函數(shù)。

在 scala 中操作符被解釋稱方法:

  • 前綴操作符:op obj 被解釋稱 obj.op
  • 中綴操作符:obj1 op obj2 被解釋稱 obj1.op(obj2)
  • 后綴操作符:obj op 被解釋稱 obj.op
scala> val ml = List(1,2,3,4)
ml: List[Int] = List(1, 2, 3, 4)

scala> ml.map((x)=>2*x)
res0: List[Int] = List(2, 4, 6, 8)

scala> def m(x:Int) = 2*x
m: (x: Int)Int

scala> ml.map(m)
res1: List[Int] = List(2, 4, 6, 8)

scala> def m(x:Int) = 3*x
m: (x: Int)Int

scala> ml.map(m)
res2: List[Int] = List(3, 6, 9, 12)

可以在方法名后面加一個下劃線強制變成函數(shù)。

注意: 方法名與下劃線之間至少有一個空格喲!

scala> def m3(x: Int): Int = x * x * x
m3: (x: Int)Int

scala> val f3 = m3_

  
   :10: error: not found: value m3_       val f3 = m3_                ^ scala> val f3 = m3 _ f3: Int => Int = 
   
     scala> f3(3) res0: Int = 27 
   
  

文章題目:講解一下Scalamethod和function的區(qū)別和聯(lián)系
標題來源:http://m.5511xx.com/article/ccdgosj.html