2017-09-15 81 views
0

所以,我相信我理解纯函数。类似于abs或sqrt的地方,输出依赖于输入并且没有副作用。不过,我很困惑这种方法如何工作。C++/c#类中的纯方法

如果我们将一个方法作为一个带有隐式参数的函数来看,那么我会假定像下面那样的方法确实是纯的。

class Foo 
{ 
    int x; 

    [Pure] public int Bar() { return x * 2; } 
} 

这是一个正确的假设,该函数是纯粹的吗?如果read变量是readonly/const,它会有所作为吗?

+0

如果调用者不能准确预测结果,那么它不是纯粹的。所以这不是纯粹的。那么为什么呼叫者会使用它?因为它可能是一个复杂的操作,调用者不想实现它。换句话说,结果只能从输入中推导出来,而没有别的。 – CodingYoshi

+0

为什么标记为C++? –

+0

@passerby因为它是语言不可知的。所以它可以被标记任何东西。但是,为什么是这样的:pehaps用户想要这些语言的示例 – CodingYoshi

回答

1

的功能被认为是纯粹的时:

功能始终计算给定相同的参数值(一个或多个)相同的结果的值。函数的结果值可以不依赖于任何 隐藏的信息或状态,其可以同时执行程序 前进或程序的不同执行之间改变...

Wikipedia

Bar不是纯,因为它取决于变量x。所以如果x的值发生变化,Bar()的结果在不同的场合会有所不同。

想象这样的事情:

var obj = new Foo(); 
obj.x = 1; 
obj.Bar(); // Returns 2. 
obj.x = 5; 
obj.Bar(); // Returns 10. 

然而,如果x是一个常数/只读的,它仍然是纯粹的,因为的Bar()结果永远不会改变。

+0

我想补充一点,如果你不能,为了理解的目的,用它应该返回的值替换你的方法调用,并让你的程序运行相同,那么这个方法也不是纯粹的。 – Kilazur

相关问题