【问题标题】:Properties and ref return values in DD 中的属性和 ref 返回值
【发布时间】:2023-03-06 10:05:02
【问题描述】:

在 D 中测试以下内容

import std.stdio;

struct S
{
    int _val;
    @property ref int val() { return _val; }
    @property void val(int v) { _val = v; writeln("Setter called!"); }
}

void main()
{
    auto s = S();
    s.val = 5;
}

输出"Settter called!"

编译器使用什么规则来确定是调用第一个实现还是第二个实现?

【问题讨论】:

    标签: properties ref d


    【解决方案1】:

    这里提供了两个@property 方法,一个接受参数,另一个不接受。在执行s.val = 5; 时,您实际上在执行的是s.val(5),但由于val@property,您可以将其写为属性而不是方法调用(参见http://d-programming-language.org/function.html#property-functions)。从 s.val(5) 开始,编译器可以进行标准重载解析 - 请参阅 http://d-programming-language.org/function.html#function-overloading

    【讨论】:

    • 是的,但他的第一个@property 方法返回ref int,因此编译器也可以执行auto a = val(); a = 5 之类的操作。它实际上 确实 使用 dmd v2.054 和原始代码 - 第一个实现被调用。如果你用源文件中的实现切换行,setter 被调用......所以目前 dmd 似乎只是调用源文件中的第一个实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多