繁体   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