d语言之struct

参考自d程序设计语言---个人博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow mehtml

突然懒得打字了,之后再慢慢添上吧。----坑已在下面填上。node

    结构体和类的不一样我也很困惑,个人理解,class表示逻辑操做,struct表示数据对象
    列举下类和struct的不一样
        结构体能代替对象,反过来不行
        结构体不支持继承和接口的实现
        在结构体内不支持super
        结构体不容许改写,全部方法都是最终的
        结构体不能和synchronized和struct一块儿使用
        struct不支持默认的构造方法this()
        struct不支持定义构造方法this(this)
        结构体不支持protected修饰符
    结构体的复制,是值传递,对象是引用
        好比 xx s1;auto s2 = s1;s1和s2指向两个不一样的对象
    结构对象传递给函数是值传递
    结构对象的生命周期很是有限,相似函数里面临时变量的周期
    构造函数,
        默认不运行代码实现this()构造器
        可是声明的时候能够使用默认的
    转发构造函数是被容许的
    this(this)若是结构里面含有引用类型数据
        能够使用this(this)在拷贝的时候作些特别的操做
    能够定义一个析构函数~this()
    能够定义任意数量的的静态构造器和析构函数
    结构能够定义方法和静态方法
    @property支持属性的方式调用方法
    结构内部能够嵌套类和结构
    类内部也能够嵌套结构和类
    #disable能够禁用一些方法
    结构体的偏移align消除结构见的间隙
    联合union和c语言同样
    枚举值和枚举类型
        enum ae =123;
        enum a1{aa,ab,ac};ide

import std.stdio;
import std.algorithm;
import std.conv;

struct Widget {


	enum fd = 0.2;
	static immutable defaultName = "my Widget";
	string name = defaultName;
	uint width,height;
	static double getFd(){
		return fd;
	}
	void changeName(string otherName){
		name = otherName;
	}
	int x = 22;
	double y = 3.14;
}
class C {
	int x  = 11;
	double y = 3.14;
}

void changeStruct(Widget w){
	w.x += 100;
}
void changeStructRef(ref Widget w){
	w.x += 100;
}

struct Test{
	private int[] arr;
	int a;
	double b;
	int length = 100;
	//this(){}//error
	this(double b){
		this(b,int.init);
	}
	this(double b,int a){
		this.b = b;
		this.a = a;
		arr = new int[length];
	}
	this(this){
		arr = arr.dup;
	}


	int get(int key){
		return arr[key];
	}
	void set(int key,int value){
		arr[key] = value;
	}
 	@property ulong len(){
 		return arr.length;
 	}

}

struct Test2{
	Test t1;
	int x;
}

struct Test3{
	Test2 t2;
	string name;
}


void fun(int a){
	assert(a > 1);
}

struct showThis{
	int a = 0;
	int x = 11;
	static int callTime = 10;
	static this(){
		writeln("static this 1");
	}

	static this(){
		writeln("static this 2");
	}

	static ~this(){
		writeln("static ~this 1");
	}

	static ~this(){
		writeln("static ~this 2");
	}
	static ~this(){
		writeln("static ~this 3");
	}

	this(int a){

		this.a = a;
		writeln("start show this  a is ",a);
	}

	~this(){
		writeln("show this is over a  is ",a);
	}
	void fun(){
		.fun(a);
		writeln(a);
	}

	ref showThis opAssign(ref showThis ths){
		x = ths.x+10;
		writeln("##",x);
		return this;
	}
	bool opEquals(ref const showThis ths) {
		return ths.x == x;
	}
}
struct List{
private:
	class Node{
		int value;
		abstract Node left();
		abstract Node right();
	}

	class NodeLeaf:Node{
		Node _left,_right;
		override Node left(){
			return _left;
		}
		override Node right(){
			return _right;
		}
	}
	class Leaf:Node{
		override Node left(){
			return null;
		}
		override Node right(){
			return null;
		}
	}
	Node root;
public:
	void add(int value){
		writeln("add node");
	}
	void search(int value){
		writeln("search value");
	}
}

void crawerIt(){

	struct HtmlAtrribute{
		string code = "UTF-8";
		int try_time = 3;
		string refer = "http://www.baidu.com";
		string html;

		this(string html){
			this.html = html;
		}

		void tidy(){
			writeln("tidy");
		}

		void convertTo(){
			writeln("conver to ",code);
		}
		~this(){
			writeln(" clean HtmlAtrribute");
		}

	}
	auto html = "addadf";
	auto htmAtrObj = HtmlAtrribute(html);
	htmAtrObj.tidy();
	htmAtrObj.convertTo();

}

struct Final(T){
	private T cur;
	this(T load){
		this.cur = load;
	}
	private void opAssign(Final);
	@property T get() {return cur;}
	alias get this;
}


struct MyWidget{
	int x;
	private intFloat _times;

	union intFloat{
		int _int;
		double _float;
	}

	this(int x){
		this.x = x;
	}
	void varDump(){
		writeln("var dup struct");
	}
}

//get type by template
 template select(bool cond,T1,T2){
 	static if(cond){
 		alias T1 Type;
 	}else{
 		alias T2 Type;
 	}
 }

template isSomething(T){
	enum bool value = is(T:const(char[])) || is(T:const(wchar[])) || is(T:const(dchar[]));
}

mixin template InjectX(T){
	private T x;
	T getX(){ return x; }
	void setX(T y){
		x = y;
	}
}

mixin InjectX!double;
class ClassInject{
	mixin InjectX!double;
}
struct StructInject{
	mixin InjectX!double;
}
void funcJectX(){
	mixin InjectX!double;
	setX(10);
	assert(getX() == 10);
}




unittest {
	//simple use struct
	Widget w;
	assert(w.getFd == 0.2);
	w.changeName("weibo_page_book");
	
	//assign on c
	C c1 = new C;
	auto c2 = c1;
	c2.x = 22;
	assert(c1.x == 22);
	Widget w2;
	auto w3 = w2;
	w3.x = 88;
	assert(w2.x != 88);
	assert(w2.x == 22);

	//struct as function param
	changeStruct(w3);
	assert(w3.x == 88);
	changeStructRef(w3);
	assert(w3.x == 188);

	//while ref data in struct you need this(this)
	auto t = Test(11.2);
	assert(t.b == 11.2);
	t.set(1,12);
	assert(t.get(1) == 12);
	t.set(2,22);
	t.set(3,33);
	t.set(4,44);
	assert(t.len == 100);
	auto t2 = t;
	t2.a = 222;
	t2.set(1,111);
	assert(t.a != 222);
	//assert(t.get(1) == 111);
	assert(t.get(1) != 111);	

	//this(this) in struct{struct}
	Test2 test2;
	test2.t1 = Test(11.2);

	Test3 test3;
	test3.t2.t1 = Test(11.23);
	Test tttt1 = Test(12.1);

	//test this(this)
	Test3 test33;
	test33 = test3;
	test3.t2.t1.set(1,9999);
	assert(test33.t2.t1.get(1) != 9999);

	//struct use area
	{
		showThis st = showThis(31);
		st.fun();
	}
	/*
	for(int i =0;i<10;i++){
		showThis st = showThis(i);
	}*/
	showThis st1 = showThis(30);
	showThis st2 ;
	st2 = st1;
	assert(st2.x == 21);
	st2.x = 12;
	//assert(st2.a == 40);
	assert(st2 != st1);
	crawerIt();

	auto mywid = Final!(MyWidget)(MyWidget(12));
	mywid.varDump();

	void chageMywid(ref MyWidget my){
		my =  MyWidget(42);
	}
	//chageMywid(mywid);
	writeln(mywid.x);

	MyWidget* myref = new MyWidget(44);
	(*myref).varDump();
	//align(1)
 	assert(typeid(typeof(to!double(mywid.x))));
 	mywid._times._int = 11;
 	mywid._times._float = 11.2;

 	enum int enum_a = 1;
 	alias int myint;
 	myint myint_t = 17;

 	alias select!(false,int,double).Type myType;
 	assert(is(myType == double));
 	assert(isSomething!(string).value == true);
 	//assert(isSomething!(int).value == true);

 	funcJectX();
 	auto cj = new ClassInject();
 	cj.setX(10);
 	assert(cj.getX() == 10);
 	StructInject sj;
 	sj.setX(100);
 	assert(sj.getX() == 100);

}
相关文章
相关标签/搜索