1. 程式人生 > >Scala方法和函式的區別

Scala方法和函式的區別

Scala中的方法跟Java的方法一樣,方法是組成類的一部分。方法有名字、型別簽名,有時方法上還有註解,以及方法的功能

實現程式碼(位元組碼)。

Scala中的函式是一個完整的物件。Scala中用22個特質(trait)抽象出了函式的概念。這22特質從Function1到Function22

 

如上圖中的Function10代表的是:有10個形參,返回值為R(協變)的函式。

Scala中的函式其實就是繼承了這些Trait的類的物件,如:我們通過函式字面量定義一個函式

其實上述函式的定義方式跟如下定義方式等同:

由於Function2是特質,不能直接new。上述new Function2[Int,Int,Int](){}其實是定義並例項化一個實現了Function2特質的類的物件。

apply是scala中的語法糖:對一個物件obj上呼叫obj(),scala編譯器會轉換為obj.apply();在一個類clazz上呼叫clazz(),scala編譯器會轉

換為clazz_company_obj.apply(),其中clazz_company_obj為clazz的伴生物件。

具體的差異,總結為如下幾點:

1.方法不能作為單獨的表示式而存在(引數為空的方法除外),而函式可以。如:

 在如上的例子中,我們首先定義了一個方法m,接著有定義了一個函式f。接著我們把函式名(函式值)當作最終表示式來用,由於f本身就是

一個物件(實現了FunctionN特質的物件),所以這種使用方式是完全正確的。但是我們把方法名當成最終表示式來使用的話,就會出錯。

2.函式必須要有引數列表,而方法可以沒有引數列表

 在如上的例子中,m1方法接受零個引數,所以可以省略引數列表。而函式不能省略引數列表

3.方法名是方法條用,而函式名只是代表函式物件本身

這個比較容易理解。因為儲存函式字面量的變數(又稱為函式名或者函式值)本身就是實現了FunctionN特質的類的物件,要呼叫物件的apply

方法,就需要使用obj()的語法。所以函式名後面加括號才是呼叫函式。如下:

4.在需要函式的地方,如果傳遞一個方法,會自動進行ETA展開(把方法轉換為函式)

如果我們直接把一個方法賦值給變數會報錯。如果我們指定變數的型別就是函式,那麼就可以通過編譯,如下:

當然我們也可以強制把一個方法轉換給函式,這就用到了scala中的部分應用函式:

5.傳名引數本質上是個方法

 傳名引數實質上是一個引數列表為空的方法,如下:

如上程式碼實際上定義了一個方法m1,m1的引數是個傳名引數(方法)。由於對於引數為空的方法來說,方法名就是方法呼叫

,所以List(x,x)實際上是進行了兩次方法呼叫。

由於List(x,x)是進行了兩次方法呼叫,所以得到兩個不同的值。

如果我們稍微修改一下函式的m1的定義,把x先快取起來,結果就會跟以前大不一樣。

相關推薦

Scala基礎02-Scala方法函式及其區別

Scala運算子及函式和方法的呼叫 但有一點特別的:這些操作符在scala中實際上是方法。例如: a + b 是如下方法呼叫的簡寫: a.+(b) a 方法 b可以寫成 a.方法(b)。 方法的呼叫(2.後面按下table,會有以下相關提示) 定義方法和

[譯]Scala方法函式區別

Scala中的方法跟Java的方法一樣,方法是組成類的一部分。方法有名字、型別簽名,有時方法上還有註解,以及方法的功能 實現程式碼(位元組碼)。 Scala中的函式是一個完整的物件。Scala中用22個特質(trait)抽象出了函式的概念。這22特質從Function1到Function22   如上圖

Scala方法函式區別

Scala中的方法跟Java的方法一樣,方法是組成類的一部分。方法有名字、型別簽名,有時方法上還有註解,以及方法的功能 實現程式碼(位元組碼)。 Scala中的函式是一個完整的物件。Scala中用22個特質(trait)抽象出了函式的概念。這22特質從Function1到Function22  

Scala方法定義,方法函式區別,將方法轉換成函式

1. 定義方法和函式 1.1. 定義方法 方法的返回值型別可以不寫,編譯器可以自動推斷出來,但是對於遞迴函式,必須指定返回型別 1.2. 定義函式 1.3.方法和函式的區

scala方法函式區別

定義 方法和函式是作為兩種東西在scala中存在的,在大多數時候他們差不太多,但是時不時的可能會有一些問題體現出他們各自不一樣的情況。 函式型別:形式為(T1,…, Tn) => U,其實是FunctionN trait的簡寫形式,匿名函式和方法值具有

Scala方法函式區別

在Scala中函式和方法有什麼區別 方法可以作為一個表示式的一部分出現(呼叫函式並傳參),但是方法(帶參方法)不能作為最終的表示式, 但是函式可以作為最終的表示式出現: scala> //定義一個方法 scala> def m(x:Int) = 2*x

scala方法函式有什麼區別

A Function Type is (roughly) a type of the form (T1, ..., Tn) => U, which is a shorthand for the trait FunctionN in the standard li

Scala方法函式區別雖然小,但是這一點你必須知道

  簡介   Scala 有方法與函式,二者在語義上的區別很小。Scala 方法是類的一部分,而函式是一個物件可以賦值給一個變數。換句話來說在類中定義的函式即是方法。 我們這裡會統稱為函式。   Scala 中的函式是一個繼承了 Trait類的物件。函式定義由一個 def 關鍵字開始,緊接

淺談c#語言的類,事件,物件,方法函式區別

在討論這些關係之前讓我們先來了解一下面向過程和麵向物件的區別: 所謂面向過程就是把一切事物或者需要解決的問題都當做是一個過程來處理,而面向物件則是把一切事物當成一個一個的物件來處理,這兩者有什麼區別呢,舉一個簡單的例子: 編寫一個駕駛汽車的程式: (1)面向過程的程式設計:

OC方法函式區別

  oc方法和函式的區別 /*  1> 方法都是以減號開頭 -  2> 方法的宣告必須寫在@interface 和@end之間     物件方法的實現必須寫在@implementation 和@end之間  3> 物件方法只能由物件

Scala方法函式區別

1. 函式在scala語言中,是函式程式設計的 “頭等公民” 2. 方法是 scala 面向物件中的概念,主要定義在類,特質,抽象類中 3. 函式是一個物件,方法本質就是類中的一個普通的方法 4. 函式可以作為引數進行傳遞,可以作為返回值返回,但是方法不行 5. 方法

原生js中slice()方法splice()區別

ole pre 結束 兩個 object splice 區別 沒有 slice slice()方法和splice()方法都是原生js中對數組操作的方法。 slice(),返回一個新的數組,該方法可從已有的數組中返回選定的元素。例如:arrObject(start,end

Scala 方法函式

Scala 方法與函式:http://www.runoob.com/scala/scala-functions.html Scala 有方法與函式,二者在語義上的區別很小。Scala 方法是類的一部分,而函式是一個物件可以賦值給一個變數。換句話來說在類中定義的函式即是方法。 Scala 中的方法跟 Jav

Math.round(),增強for迴圈,equals方法==的區別,,instanceof運算子三目運算子的用法

1.Math.round() 有這樣一個問題,將數字23.4,23.6轉換成int型,得到的新數字是多少? 事實上直接轉換的話得到的數字都是23。但在我們程式設計的過程中有時候需要對數字進行四捨五入取整,那麼顯然上面的直接轉換就不能實現我們的要求。但好在java裡面給我提供了一個可以實現四捨五入

Java HttpServletRequest中getAttribute()方法getParameter()區別

  一、ServletRequest介面   HttpServletRequest介面繼承了ServletRequest介面,實現類通常代表一個實際的Http Request。   Servlet容器負責建立一個HttpServletRequest物件(在Web伺服器接收到瀏覽器的一個請求後),然後Ser

Java 的equals()方法 == 的區別聯絡

淺談Java中的equals和==  在初學Java時,可能會經常碰到下面的程式碼: String str1 = new String("hello"); String str2 = new String("hello"); System.out.print

Python:collection模組(內建了一些群集相關的方法函式

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: coll

isinstance type issubclass 區分方法函式 反射:hasattr getattr setattr delattr

isinstance      type      issubclass   isinstance: 判斷你給物件是否是xx型別的. (向上判斷)   type: 返回xxx物件的資料型別   issubclass: 判斷xxx類是否xx

區分方法函式

# def func(): # print("我是函式") # # class Foo: # def chi(self): # print("我是吃") # # # print(func) # <function func at 0x0000000001D42E18

python isinstanceissubclass,區分方法函式,反射

一.isinstance和issubclass 1.isinstance class Animal: def eat(self): print('剛睡醒吃點兒東西') class Cat(Animal): def play(self): print