[英]Can anyone explain me what is state and mutable data?
在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免了状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
谁能解释一下什么是状态和可变数据? 谁能给我 JAVA 或 JavaScript 的例子。
状态统称为存储在对象中的数据,这些数据决定了对象的当前属性。 例如,如果您有一个BankAccount
对象,则该帐户的所有者和其中的金额代表该帐户的状态。
然而,并不是所有的 state 都对函数式编程不利,只有mutable + one 是不可接受的。 例如,组成字符串的字符就是该字符串的状态。 如果您不能更改字符串的内容,则称其具有不可变状态。 这非常适合函数式编程范式。
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.