簡體   English   中英

誰能解釋一下什么是狀態和可變數據?

[英]Can anyone explain me what is state and mutable data?

在計算機科學中,函數式編程是一種編程范式,它將計算視為對數學函數的評估,並避免了狀態和可變數據。

http://en.wikipedia.org/wiki/Functional_programming

誰能解釋一下什么是狀態和可變數據? 誰能給我 JAVA 或 JavaScript 的例子。

狀態統稱為存儲在對象中的數據,這些數據決定了對象的當前屬性。 例如,如果您有一個BankAccount對象,則該帳戶的所有者和其中的金額代表該帳戶的狀態

然而,並不是所有的 state 都對函數式編程不利,只有mutable + one 是不可接受的。 例如,組成字符串的字符就是該字符串的狀態。 如果您不能更改字符串的內容,則稱其具有不可變狀態。 這非常適合函數式編程范式。


+ mutable是“可變”的花哨詞。

mutable 表示任何可以改變的東西,即 int

int a = 0;
System.out.prtinln(a); //prints 0
a = 2;
System.out.prtinln(a); //now prints 2, so its mutable

在java中,字符串是不可變的。 您不能僅更改字符串值的引用。

String s1 = "Hello";
System.out.println(s1); //prints Hello
String s2 = s1;
s1 = "Hi";
System.out.println(s2); //prints "Hello" and not "Hi"

狀態是類的實例將具有的東西(對象)。

如果一個對象的屬性具有某些值,則其處於不同的狀態,則同一類的另一個對象具有不同的屬性值

可變狀態是可以使函數返回不同值的一切,盡管它使用相同的參數調用。

Java 中的簡單示例:

public static double badSqrt(double x) {
    double r = Math.sqrt(x);
    if (System.currentTimeMillis() % 42L == 0L) return r;
    return r + 0.000000001;
}

此函數有時會計算出稍微不正確的結果。 我們說badSqrt是不純的,因為它的結果不僅僅取決於它的參數(和常量)。

對於調試包含調用 badSqrt() 或不純函數的程序的人來說,這是一場噩夢。 通常,該程序似乎有效,但偶爾會產生錯誤的結果。 除非該函數被清楚地記錄在案或源代碼可用,否則很難跟蹤錯誤。

在這種情況下,據說函數的行為取決於可變狀態。 這種狀態可以被程序的完全不相關的部分改變(變異),或者像在這個例子中一樣,被另一個程序(操作系統)改變(變異)。

不可變對象的一個​​經典示例是 Java String 類的實例。

 String s = “ABC”;

 s.toLowerCase();

 System.out.println(s);

輸出 = ABC

這是因為 s 繼續引用其不可變字符串。 如果要對 s 進行變異,則需要采用不同的方法:

s = s.toLowerCase();

這將創建一個新的引用。 現在 String s 引用了一個包含“ abc ”的新 String 對象。

假設 int i=5;

現在變量 i 的狀態是 ,現在它包含值 5。

假設現在我已經設置了 i=7;

現在變量 i 的狀態是,現在它包含值 7,它替換了 5。

如果可以改變值,那么它被稱為可變的,這意味着我們可以在這里改變狀態。

如果無法更改值,則將其稱為不可變的。

這是狀態和可變狀態之間差異的最簡單解釋。 幾乎每種語言都有內置的方法和函數,我們可以調用它們來做不同的事情。 這些方法和函數保持自己的狀態,我們可以根據我們使用的參數來操縱它。 不同的參數給出不同的參數(arguments)可以返回不同的值。 現在,假設我們創建了一個構造函數(JavaScript)來存儲我們自己的狀態。 然后我們編寫一個函數來根據用戶輸入操縱狀態,並且在我們編寫它之后我們不會更改參數,即使它被調用。 但是可以使用 setState 更改 state 中的內容,從而在不更改參數的情況下從同一函數中進行無休止的更改。

狀態數據是靜態的。 即超級卡。 可變數據更像是二進制組裝的人工運動范式。 QED -Bryan Meluch Purdue 1997 [verb.atim] Web

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM