d定义转串
原文
提示是WebFreak
的贡献.感谢他们写这篇
文章!
有很多方法可自定义toString
方法.方法不完全是D的一部分
,而是Phobos
中的约定
:
用.to!string
时,会如下:
1,对象到串的转换
调用对象
的toString
,如果对象为null
,则返回"null"
串.
2,如,覆盖Object.toString
3,如果根据std.format.write
准则定义,则结构
到串的转换调用结构
的toString
方法.
来自std.format.write
文档:
聚集
类型可定义各种toString
函数.如果此函数带FormatSpec
或以格式串
为参数,则该函数
决定接受哪些格式符.
toString
应有以下签名之一:
void toString(Writer, Char)(ref Writer w, const ref FormatSpec!Char fmt)
void toString(Writer)(ref Writer w)
string toString();
其中,Writer
是接受符
(第一个版本的符
类型)的输出区间
.Writer
不必调用
模板类型.
有时无法用模板
,如toString
覆盖Object.toString
时.此时,可用以下(较慢且不灵活
)函数:
void toString(void delegate(const(char)[]) sink, const ref FormatSpec!char fmt);
void toString(void delegate(const(char)[]) sink, string fmt);
void toString(void delegate(const(char)[]) sink);
多个toString
版本可用时,有Writer
的版本优先级大于接收器
版本.toString()
的串版本
优先级最低.
现在在结构
中定义toString
的最简单
方法如下:
string toString() const @safe {
import std.conv : text;
// 如用文本, format!"", 或普通连接:
return text(fieldA, ", ", fieldB, ", ", etc);
也可用toString(Writer)(ref Writerw)
接口,但我不建议,因为在那犯的错误(如输入
函数或编译错误操作
),使.to!string
和格式(format)
不再用该函数
,使它无用.
但是,可结合二者:
string toString() const @safe {
import std.array : appender;
auto ret = appender!string;
this.toString(ret);
return ret.data;
}
void toString(W)(ref W writer) const @safe {
writer.put(fieldA);
writer.put(", ");
writer.put(fieldB);
writer.put(", ");
writer.put(etc);
}
还可基于回调/接收器
方法重载来覆盖
串:
void toString(void delegate(const(char)[]) sink)
{
sink(fieldA);
sink(", ");
sink(fieldB);
sink(", ");
sink(etc);
}
缺点
是,不能按@safe,nothrow,pure,
等标记接收器
.也不能限制接收器
复制属性
.但是,可在此抓编译器错误
,因此比仅用基于Writer
方法要好.
定义Writer
的toString
方法,及用appender!string
调用writer
的toString
很可靠,可抓大多数错误
,如果确实无法编译
奇怪的writer
类型,也可回退到用追加器
.
未来可改进writer
重载调用.不应检查
__traits(compiles, ...)
//或
is(typeof(...))
而应,检查是否有给定签名
方法,然后试调用
它.(也许需要无需试编译
,就可查看
是否有潜在
匹配的函数重载
的一些特征
?)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现