谁能解释一下状态和可变数据是什么?

时间:2013-04-27 12:45:03

标签: java javascript functional-programming immutability

  

在计算机科学中,函数式编程是一种编程范式   将计算视为数学函数的评估   并避免状态和可变数据。

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

任何人都可以解释一下状态和可变数据是什么吗?任何人都可以给我JAVA或JavaScript的例子。

7 个答案:

答案 0 :(得分:6)

State指的是存储在对象中的数据,用于确定对象的当前属性。例如,如果您有BankAccount个对象,则该帐户的所有者及其中的金额代表该帐户的

然而,并非所有状态都不适合函数式编程,只有 mutable + 之一是不可接受的。例如,组成字符串的字符是字符串的状态。如果您无法更改字符串的内容,则称其具有不可变状态。这非常适合函数式编程范例。

<小时/> + mutable 是“多变的”这个奇特的词。

答案 1 :(得分:6)

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"

状态是类的实例将具有的东西(对象)。

如果一个Object的属性具有某些值,则它处于不同的状态,那么具有不同属性值的同一个类的另一个对象

答案 2 :(得分:3)

可变状态是可以使函数返回不同值的所有东西,尽管它使用相同的参数调用。

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()或不纯函数的调用的程序的人来说,这是一场噩梦。通常,该计划似乎有效,但偶尔会出现错误的结果。除非功能明确记录或源代码可用,否则很难跟踪错误。

在这种情况下,据说功能的行为取决于可变状态。这是可以由程序的完全不相关的部分更改(变异)的状态,或者,如示例中的另一个程序(操作系统)。

答案 3 :(得分:2)

不可变对象的典型示例是Java String类的实例。

 String s = “ABC”;

 s.toLowerCase();

 System.out.println(s);

输出= ABC

这是因为s继续引用其不可变的String。如果你想改变s,需要采用不同的方法:

s = s.toLowerCase();

这将创建 引用。现在,String引用了一个包含“ abc ”的新String对象。

答案 4 :(得分:1)

假设 int i = 5;

现在变量i的状态是,现在它包含值5。

现在假设我设置了i = 7;

现在变量i的状态是,现在它包含值7,它已经取代了5。

  

如果可以改变值,那么它被称为as-mutable意味着   我们可以在这里改变状态。

如果无法更改值,则将其称为“不可变”。

答案 5 :(得分:0)

这是状态和可变状态之间差异的最简单解释。几乎每种语言都有内置的方法和函数,我们可以调用它们来做不同的事情。这些方法和函数保持其自己的状态,我们可以根据所使用的参数来对其进行操作。不同的参数赋予不同的参数(参数)可以返回不同的值。现在,假设我们制作了一个构造函数(JavaScript)以存储我们自己的状态。然后,我们编写一个基于用户输入来操纵状态的函数,并且在编写完该函数后,即使调用它,我们也不会更改参数。但是可以使用setState更改内部状态的内容,从而无需更改参数即可对同一函数进行无休止的更改。

答案 6 :(得分:-1)

状态数据是静态的。即超级卡。可变数据更类似于二进制组装的人工运动范例。 QED -Bryan Meluch Purdue 1997 [verb.atim] Web