类 的 Dlang 泛型
Dlang generics for classes
第一次海报。我已经使用 Java 几年了,并决定学习 D。在 Java 中,您可以使用泛型声明一个 class,并从中创建一个新对象class。喜欢:
public class foo<T>
{
public foo() { ... }
}
然后只需调用 foo<String> f = new foo<>();
。我试图在 D 中实现相同的功能,但出现编译错误,如:"class core.collection.RingBuffer.RingBuffer(T) is used as a type"。查看D的教程,我发现泛型编程是使用模板实现的。但是,我无法对官方tutorials/docs做出正面或反面的判断。有人可以向我解释一下吗?谢谢
当您没有在右侧实例化模板时会出现该错误 - 它会抱怨 "foo is used as a type" 因为 foo 本身还不是一个类型,它是一个类型的模板。这意味着它在用 !(arguments).
实例化之前不会成为实际类型
您的 Java 代码 new foo<>()
与 D 中的代码不完全相同:在 D 中,您需要在右侧给出类型。
所以尝试:
foo!string f = new foo!string();
或
foo!(string) f = new foo!(string)();
!
后面的模板参数周围的括号是可选的,如果后面只有一个单词,所以这两个意思相同。
在 D 中不需要将类型写两次,但与其将其留在右侧,还可以通过类型推断将其留在左侧。这也会编译:
auto f = new foo!string();
这在 D 中很常见。
这是使用泛型的简约 Java 代码:
class Foo <T>
{
public Foo (String arg) {System.out.println ("Hello, " + arg + "!");}
}
public class TestClass
{
public static void main (String [] args)
{
Foo <String> f = new Foo <> ("Alice");
Foo <String> g = new Foo <String> ("Bob");
}
}
这是它的 D 等价物:
import std.stdio;
class Foo (T)
{
public this (string arg) {writeln ("Hello, " ~ arg ~ "!");}
}
void main ()
{
auto f = new Foo !(string) ("Alice");
Foo !(string) g = new Foo !(string) ("Bob");
}
这些只是完整的可编译示例。 .
中解释了推理
...并使用默认参数
template DataList( Data = string )
{
class DataList
{
Data data;
this()
{
// ...
}
}
}
//
auto list = new DataList!string();
// readable
alias DataList!string List;
auto l = new List();
第一次海报。我已经使用 Java 几年了,并决定学习 D。在 Java 中,您可以使用泛型声明一个 class,并从中创建一个新对象class。喜欢:
public class foo<T>
{
public foo() { ... }
}
然后只需调用 foo<String> f = new foo<>();
。我试图在 D 中实现相同的功能,但出现编译错误,如:"class core.collection.RingBuffer.RingBuffer(T) is used as a type"。查看D的教程,我发现泛型编程是使用模板实现的。但是,我无法对官方tutorials/docs做出正面或反面的判断。有人可以向我解释一下吗?谢谢
当您没有在右侧实例化模板时会出现该错误 - 它会抱怨 "foo is used as a type" 因为 foo 本身还不是一个类型,它是一个类型的模板。这意味着它在用 !(arguments).
实例化之前不会成为实际类型您的 Java 代码 new foo<>()
与 D 中的代码不完全相同:在 D 中,您需要在右侧给出类型。
所以尝试:
foo!string f = new foo!string();
或
foo!(string) f = new foo!(string)();
!
后面的模板参数周围的括号是可选的,如果后面只有一个单词,所以这两个意思相同。
在 D 中不需要将类型写两次,但与其将其留在右侧,还可以通过类型推断将其留在左侧。这也会编译:
auto f = new foo!string();
这在 D 中很常见。
这是使用泛型的简约 Java 代码:
class Foo <T>
{
public Foo (String arg) {System.out.println ("Hello, " + arg + "!");}
}
public class TestClass
{
public static void main (String [] args)
{
Foo <String> f = new Foo <> ("Alice");
Foo <String> g = new Foo <String> ("Bob");
}
}
这是它的 D 等价物:
import std.stdio;
class Foo (T)
{
public this (string arg) {writeln ("Hello, " ~ arg ~ "!");}
}
void main ()
{
auto f = new Foo !(string) ("Alice");
Foo !(string) g = new Foo !(string) ("Bob");
}
这些只是完整的可编译示例。
...并使用默认参数
template DataList( Data = string )
{
class DataList
{
Data data;
this()
{
// ...
}
}
}
//
auto list = new DataList!string();
// readable
alias DataList!string List;
auto l = new List();