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
就行了,普通的旧成员
函数工作得很好.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现