官术网_书友最值得收藏!

2.1.2 不可變性

正如前面的例子所示,函數式編程的一個關鍵特性是不可變性。如果某樣東西不隨時間變化,那么它就是不可變的。如果決定以函數式編程的方式編寫代碼,我們必須避免可變數據,使用純函數對程序進行建模。

讓我們來看一個例子。假設,我們使用字典在平面上定義了一個點和向量:

如果想計算用向量移動該點后所生成的點,我們可以用函數式編程的方式,用函數創建一個新點。示例如下:

這個函數是純函數:給定相同的點和向量作為輸入,得到的位移點總是相同,而且函數處理的數據沒有任何改變,也包括函數參數。

運行這個函數,將之前定義的point和vector傳入,結果如下:

與之相反,非函數式編程的解決方法可能需要使用如下函數來改變原來的點:

這個函數修改了作為參數輸入的point,違反了函數式編程的關鍵規則。

請注意,函數名稱中使用了in_place,這是一種常用的命名約定,它意味著原對象將被修改。我們將在全書中遵循這種命名約定。

現在,讓我們看看使用displace_point_in_place函數會發生什么:

如你所見,函數沒有返回任何東西,這是非純函數的標志,因為函數發揮作用時,必然在某個地方改變了某些東西。在本例中,“某些東西”是點,其坐標已被更新。

函數式風格的一個重要優點是,通過恪守數據結構的不可變性,我們可以避免意料之外的副作用。當修改某個對象時,你可能并不知道代碼中引用該對象的所有位置。如果有其他部分代碼依賴于該對象的狀態,就可能出現難以預料的副作用。因此,在對象發生改變之后,程序的行為可能與預期的不同。這類錯誤非常難發現,甚至可能需要數小時的調試。

在項目中盡量減少可變對象的數量,可以使其更可靠,更不容易出錯。

現在讓我們來看看一類特殊的函數——lambda函數,它在函數式編程中起著關鍵作用。

主站蜘蛛池模板: 洛阳市| 涞源县| 满洲里市| 怀来县| 马山县| 高清| 利津县| 年辖:市辖区| 察雅县| 益阳市| 酉阳| 隆林| 岑溪市| 常德市| 乐陵市| 和顺县| 裕民县| 黄石市| 虞城县| 黎城县| 嘉黎县| 长白| 确山县| 庆城县| 涟水县| 内黄县| 巴马| 勐海县| 岱山县| 札达县| 南华县| 上蔡县| 武汉市| 中牟县| 浏阳市| 荥阳市| 腾冲县| 龙南县| 罗甸县| 合作市| 康平县|