纯函数可以调用外部方法吗?
例如:
class Dog {
function jump(name) {
return "a dog named " + name + " jumped!"
}
function jumpTwice(names) {
var result = [];
for (var i = 0; i < 2; i++) {
result.push(jump(names[i]));
}
return result.join("\n");
}
}
可以将
jumpTwice()
视为pure function
吗?
纯函数
f
可以调用任何其他函数/方法g0...gn
。
然而,g0...gn
也必须是纯粹。
一旦你得到一个纯函数
f
并且从g
内部调用一个非纯函数
f
,那么f
就不再是纯的了。
是的,它是纯净的。它不会改变任何全局状态,也不会为相同的输入提供不同的结果。
在您给出的具体情况下,是的。但你有一个方法,而方法需要额外小心。
无论当前程序状态如何,纯函数对于任何给定输入总是给出相同的结果。方法可以被视为将其对象作为隐藏参数传递的函数。为了纯粹,该方法不得访问任何隐式状态(也不得调用任何其他易受隐式状态影响的方法/函数)。这也意味着不使用任何包含隐式状态的对象字段。 希望评论讨论能够给出如何判断上下文的示例。
仅仅避开可变字段是不够的 - 不可变字段中的值必须是可知/可预测的。例如,如果一个对象包含一个不可变的私有字段,该字段在创建对象时被赋予一个随机数,则任何使用该值来计算其输出的方法都将是不纯的。
另一方面,如果你的 Dog 类有一个在对象创建时设置的不可变名称字段,那么使用该字段的方法可以被认为是纯方法(除非其他东西使它们不合格)。
编辑
说“副作用”和“纯度”是上下文相关的(如评论中所讨论的)会很有帮助。 这就是我通过使用“可知”和“可预测”这两个词并没有完全清楚地暗示的内容。 评论讨论说明了了解背景的重要性。