gpt4 book ai didi

D - 纯类和结构

转载 作者:行者123 更新时间:2023-12-04 03:01:58 25 4
gpt4 key购买 nike

出于好奇,我输入了以下代码:

pure struct Foo{ }
pure class Bar{ }

显然,这与 DMD 和 LDC 一起编译。我不知道它做了什么(如果有的话),因为从这样的结构/类中调用不纯的函数是可以的。那么,将 pure 附加到类或结构会发生什么变化?

最佳答案

一般来说,当属性不适用时,D 倾向于忽略属性,如果没有别的,因为通用代码更容易以这种方式编写(有时,它避免编写一堆静态 if 只是为了避免将属性应用于它们不会产生任何影响的代码) - 一个例子是您可以将 static 放在模块级别的几乎任何声明中,但它实际上并没有对大多数人做任何事情它们,编译器不会提示。

但是,无论出于何种原因,当您使用属性标记结构或类时应用属性的方式有点不一致。例如,如果你用 @safe 标记了一个结构或类,那么该结构或类中的每个函数都将是 @safe,除非它被标记为 @trusted@system。相反,如果你用 pure 标记类或结构,它绝对不会做任何事情——就像用 static 一样。它只是被忽略了。

关于为什么像 @safe 这样的东西被应用到结构或类中的所有函数,而像 purenothrow 这样的属性,我的最佳猜测 被忽略是因为 @safe@trusted@system 可以通过以下方式在结构或类中的特定函数上撤消在该函数上显式使用不同的属性,而对于大多数属性,没有办法反转它们。

然而,不幸的是,当类或结构不适用或仅适用于类或结构内的声明而不是类或结构本身时,您可以用属性标记类或结构这一事实往往会使人们感到困惑(例如,有些人认为 immutable class C {..} 对类来说意味着一些特殊的东西,而这意味着类中的声明是 immutable;它会与做 class C { immutable { ... } } 没有什么不同。因此,最终,您必须熟悉每个属性的实际作用,才能知道它们何时实际应用于类或结构,何时真正仅应用于类或结构内的声明,以及何时被忽略。

就个人而言,我从不将属性应用于类或结构,除非它们专门应用于结构或类而不是其中的函数(例如,类上的 final 意味着单独的东西将其放在该类中的函数上),并且实际应用于结构或类的属性数量非常少。 static 在某些情况下(只是不在模块级别),abstractfinal 用于类,访问修饰符(public private 等)。根据 TDPL,synchronized 也应该对类是特殊的,但同步类从未真正实现过(只是同步函数)。所以,我可能错过了一个,但在我的脑海中,这是可以实际应用于结构或类的属性的完整列表,所有其他属性要么被忽略,要么应用于结构或类中的声明但不是结构或类本身。

关于D - 纯类和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47240714/

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