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就行了,普通的旧成员函数工作得很好.
浙公网安备 33010602011771号