gpt4 book ai didi

d - 这个纯函数如何能够修改非私有(private)状态?

转载 作者:行者123 更新时间:2023-12-04 17:11:59 24 4
gpt4 key购买 nike

TDPL,第167:

as long as the mutable state in a function is entirely transitory (i.e., allocated on the stack) and private (i.e., not passed along by reference to functions that may taint it), then the function can be considered pure.


import std.stdio : writeln;

struct M{
int[4] _data;

pure ref int opIndex(size_t i){ return _data[i]; }
}

pure M foo(ref M m){

m[0] = 1234;
return m;
}

void main(){

M m1 = M([7, 7, 7, 7]);

writeln(m1);
foo(m1);
writeln(m1);
}

// output:
// M([7, 7, 7, 7])
// M([1234, 7, 7, 7])

可变状态是暂时的,因为它在堆栈上,对吗?但这不是私有(private)的。那么 foo()怎么样允许修改 m1 ?

最佳答案

pure自从 TDPL 发布以来已经扩展了一点,因为 pure正如 TDPL 所描述的那样,除了简单的数学函数等之外,它的限制性太强,无法使用。你可以看看the online documentation对于当前的定义,但它基本上归结为:

  • pure函数不能访问任何在程序执行过程中可以改变的模块级或静态变量(它们必须是 const 值类型或 immutable 才能从 pure 函数访问)。
  • pure函数不能调用任何不是 pure 的函数.
  • pure函数不能执行 I/O。

  • 就是这样。没有其他限制。但是,如果 pure函数将被优化,即使它在一个语句中被多次使用,它也只会被调用一次。即:
  • 函数的参数必须是immutable或隐式转换为 immutable .

  • 理论上可以扩展为要求函数的参数必须是 immutable或隐式转换为 immutable (因此,当给定 const 参数时,可以优化具有 immutable 参数的函数),但目前情况并非如此。

    这样的 pure函数有时被称为“强” pure ,而那些无法优化的将被称为“弱” pure . TDPL 强烈描述 pure职能。弱 pure添加了函数以使 pure更普遍可用。

    虽弱 pure函数可以改变它们的参数,它们不能改变全局状态,所以当它们被强 pure 调用时函数(不能改变它们的参数),强烈的保证 pure对于相同的参数仍然成立,函数的返回值将始终相同。本质上,因为弱 pure函数不能改变全局状态,它们是强 pure 的私有(private)状态的一部分调用它们的函数。因此,它非常符合 Andrei 在 5.11.1.1 pure 部分中描述的内容。为 pure在 TDPL 中,除了函数的私有(private)状态已扩展为允许在不改变全局状态的情况下更改其私有(private)状态的函数。

    自 TDPL 以来,关于 pure 的另一个重要注意事项已添加。是函数属性推断。 pure , nothrow , 和 @safe为模板函数推断(尽管不是为普通函数)。所以,如果一个模板函数可以是 pure , 现在是 pure .它的纯度取决于它的实例化。因此,可以使用 pure使用模板函数,而以前,你通常不能,因为如果你做了 pure ,它不适用于不纯函数。但是如果你没有成功 pure , 那么你不能将它与 pure 一起使用函数,所以它是 pure 的主要问题.幸运的是,属性推断现在解决了这个问题。只要模板化函数在实例化时遵循上面列出的规则,那么它就被认为是 pure .

    关于d - 这个纯函数如何能够修改非私有(private)状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8572399/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com