虚拟静态值类型
Virtual static value types
是否可以为编译时类型安全和函数重载创建 "virtual" 值类型?
例如greet 函数总是接受一个字符串,但根据生成字符串的方法,它会调用正确的变体。
我想这样做是为了简化图书馆的 API。
例如,我没有 greetByFirstName 和 greetByLastName,而是一个 greet 方法,如下所示:
import std.array;
import std.format;
import std.stdio;
string firstName(string name) {
return name.split(" ")[0];
}
string lastName(string name) {
return name.split(" ")[1];
}
string greet(FirstName name) {
return "Hi %s!".format(name);
}
string greet(LastName name) {
return "Hello Mr. %s!".format(name);
}
unittest {
string name = "John Smith";
assert(firstName(name) == "John");
assert(firstName(name).greet() == "Hi John!");
assert(lastName(name).greet() == "Hello Mr. Smith!");
}
void main() {}
您可以创建一个具有 alias this
基类型的新类型,然后重载更具体的类型。别名这可以被认为是一种使用结构进行继承的方法,隐式转换回基本 "interface" 类型。
// these are the new types
struct FirstName {
string name;
alias name this; // this allows implicit conversion back to string when needed
}
struct LastName {
string name;
alias name this;
}
FirstName firstName(string name) { // these return the more specific type
return FirstName(name.split(" ")[0]);
}
LastName lastName(string name) {
return LastName(name.split(" ")[1]);
}
现在您的其余代码将根据需要工作,您仍然可以在需要时将 FirstName 和 LastName 视为字符串。
是否可以为编译时类型安全和函数重载创建 "virtual" 值类型?
例如greet 函数总是接受一个字符串,但根据生成字符串的方法,它会调用正确的变体。
我想这样做是为了简化图书馆的 API。 例如,我没有 greetByFirstName 和 greetByLastName,而是一个 greet 方法,如下所示:
import std.array;
import std.format;
import std.stdio;
string firstName(string name) {
return name.split(" ")[0];
}
string lastName(string name) {
return name.split(" ")[1];
}
string greet(FirstName name) {
return "Hi %s!".format(name);
}
string greet(LastName name) {
return "Hello Mr. %s!".format(name);
}
unittest {
string name = "John Smith";
assert(firstName(name) == "John");
assert(firstName(name).greet() == "Hi John!");
assert(lastName(name).greet() == "Hello Mr. Smith!");
}
void main() {}
您可以创建一个具有 alias this
基类型的新类型,然后重载更具体的类型。别名这可以被认为是一种使用结构进行继承的方法,隐式转换回基本 "interface" 类型。
// these are the new types
struct FirstName {
string name;
alias name this; // this allows implicit conversion back to string when needed
}
struct LastName {
string name;
alias name this;
}
FirstName firstName(string name) { // these return the more specific type
return FirstName(name.split(" ")[0]);
}
LastName lastName(string name) {
return LastName(name.split(" ")[1]);
}
现在您的其余代码将根据需要工作,您仍然可以在需要时将 FirstName 和 LastName 视为字符串。