Swift:實例方法的本質(zhì)是柯里化函數(shù)

聲明

本文是本人翻譯的國外的文章Instance Methods are Curried Functions in Swift。英文水平有限,有翻譯錯誤的地方,還望大家指出。

正文

在Swift方法中,實例化方法只是一種以實例作為參數(shù)的類型方法,它返回一個即將被應(yīng)用到實例中的函數(shù)。
最近我學習了關(guān)于Swift的特性,出乎我意料的是:實例方法是以實例作為第一個參數(shù)的柯里化函數(shù)。什么是柯里化函數(shù)呢?
(ps:引用的話就不翻譯了)

The basic idea behind currying is that a function can be partially applied, meaning that some of its parameter values can be specified (bound) before the function is called. Partial function application yields a new function.

Example

思考一個表示銀行賬戶的類的簡單例子:

class BankAccount {
    
    var balance: Double = 0.0
    func deposit(amount: Double) {
        balance += amount
    }
}

我們可以創(chuàng)建該類的實例并調(diào)用實例方法deposit() :

let account = BankAccount()//BankAccount
account.deposit(100)//BankAccount
print(account.balance)//100

到目前為止,一切都是很簡單的,我們還可以這樣做:

let depositor = BankAccount.deposit//BankAccount -> Double->()
depositor(account)(100)
print(account.balance)//200

上述的調(diào)用是完全等價的,這是為什么呢?我們首先將該方法分配給一個變量。需要注意的是括號后面的BankAccount.deposit-我們不調(diào)用這個方法(這將產(chǎn)生一個錯誤,因為你不能調(diào)用類型上的實例方法),僅僅是引用它,更像是C語言里面的指針。第二步是調(diào)用函數(shù)存儲在存儲變量中。其類型如下:

let depositor: BankAccount -> Double -> ()

換言之,這個函數(shù)有一個參數(shù),這個參數(shù)是銀行賬戶類的實例,返回了另一個函數(shù)。后面的方法接收一個Double類型的變量并直接return。在第二部分,你應(yīng)該能夠識別出deposit()實例方法的簽名。
我希望您可以知道的是:Swift的實例方法只是一種以實例作為參數(shù)的類型方法,并返回一個將被應(yīng)用到實例中的函數(shù)。當然,我們也可以把這些都放在一行來做,這使的類型方法和實例方法之間的關(guān)系更加清晰:

BankAccount.deposit(account)(100)
print(account.balance)//300

通過實例BankAccount.deposit(),這個實例方法被綁定到實例函數(shù)。在第二個步中,該函數(shù)將與其他參數(shù)一起被調(diào)用。這樣會很酷,對吧?

看后感

之前自己對柯里化函數(shù)了解過,還寫過一篇自己對柯里化的理解:Swift新特性之柯里化函數(shù)一次偶然在網(wǎng)上查看資料的時候看見這個標題:Instance Methods are Curried Functions in Swift,就覺得很有趣。因為是菜鳥,之前自己開發(fā)的時候接觸類的實例化方法的時候從來沒想過它會和柯里化函數(shù)有聯(lián)系。總之:漲知識了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容