d强制ufcs

原文
假设有个狗:

class Dog {
    @property {
        string name();

        void name(string name) {
            _name = name;
        }
    }

    private {
        string _name;
    }
}

如下构建:

void main() {
    Dog d = new Dog();

    d.name = "Poodle";
    writeln(d.name);
}

代码中,可看到使用了UFCS(统调)来设置对象属性.该特性很好.还使用了D@property注解,给了一些可在文档中看到的优势.

问题是没有强制执行UFCS,对@属性,这应该是很好用法,表明可在代码中如下:

void main() {
    Dog d = new Dog();

    d.name("poodle");
    writeln(d.name());
}

非UFCS版本相比,我更喜欢UFCS版本,因为它更清楚地表明它是属性,并且与官方的D风格指南非常匹配.
问题是:是否有办法强制执行UFCS语法?

@property还不成熟.可用赋值语法传递单参.

void foo(int i) {}

void main() {
    foo = 42;
}

@property没多大用.如下:

struct MyRef(T) {
    T * ptr;

    void opAssign(T value) {
        *ptr = value;
    }

    void toString(scope void delegate(in char[]) sink) const {
        sink(*ptr);
    }
}

auto myRef(T)(ref T var) {
    return MyRef!T(&var);
}//方便函数.

class Dog {
    @property name() {
        return myRef(_name);
    }

    private {
        string _name;
    }
}

void main() {
    Dog d = new Dog();


    // 很好: 如下不工作
    // d.name("poodle");


    // 但这里有个(),:(
    d.name() = "Poodle";

    import std.stdio;
    writeln(d.name);
}

已讨论弃用和删除@property很多年了.必须咬紧牙关,推动弃用过程.
或提出DIP,以理智的,完全可行实现@property,而不是像今天这样半心半意,不完整,漏洞百出的实现.
一般时,对无参函数,括号是可选的,所以真不必在函数上写@property,这可行:

struct S {
    private int _x;
    int x() { return _x; }
}

S s;
int y = s.x;

@property当前在,使用一元&操作符或返回闭包时增加混乱.我说,不值得.不要使用@property就行了,普通的旧成员函数工作得很好.

posted @   zjh6  阅读(41)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示