文档章节

d语言之struct

轻舞凋零
 轻舞凋零
发布于 2016/02/01 14:41
字数 1215
阅读 16
收藏 0

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

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

    结构体和类的不同我也很困惑,我的理解,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};

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);

}

 

© 著作权归作者所有

共有 人打赏支持
轻舞凋零
粉丝 13
博文 100
码字总数 16794
作品 0
昌平
程序员
10月编程语言排行榜:不成大器的D语言

【51CTO独家特稿】今天Tiobe发布了2011年10月编程语言排行榜,本期排行榜我们看到Lua这门语言蹿升很快,而传统的竞争对手C#和PHP正在交替自己的位置。Assembly(汇编语言)正在大踏步的向后退...

zjf_sdnu
2011/10/17
0
0
Dlang 2.080.0 版本发布,系统级编程语言

近期D语言在版本发布迭代速度上有明显提升,此次D语言 2.080.0 版本更新特性如下: 增强编译时特性可用性 提供更好的 Objective-C 兼容 废弃一些早期版本不推荐使用的类和方法 对标准库的多方...

冰力
05/13
0
0
系统级编程语言性能大PK的笑话-Go语言

喜欢和不喜欢Go语言的都喜欢拿性能PK说事. 流传比较广的是benchmarksgame的PK数据: http://benchmarksgame.alioth.debian.org/u64q/go.php 在 benchmarksgame测试中, Go语言的性能已经由之前...

chai2010
2013/08/06
0
7
LDC 1.9.0 发布,基于 LLVM 架构的 D 语言编译器

Kinke 代表LDC团队,很高兴地宣布LDC 1.9,这个版本的重点是: 编译器兼容 dlang 2.079.1 (引入了新的 -i 参数来支持最小D语言运行时); 支持 llvm 6,用于所有预构建包(Win32除外); 可...

冰力
05/13
0
3
Linux C++ 环境搭建 IDE选择 Code::Blocks

在linux下面IDE还是挺多的。 本来打算用elcipse的,但是发现了一个更好更快的C++IDE http://www.codeblocks.org/ Code::Blocks 是一个C++免费的跨平台IDE。 1,下载安装 下载地址: http...

freewebsys
2012/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hive分桶

hive为啥分桶? 更加细粒度的划分数据,既可以使用分桶技术实现。 作用 对数据进行抽样查询,较为高效。 可以使查询效率提高。 hive分桶技术 分桶字段是表内字段,默认是对分桶的字段进行has...

Mr_yul
7分钟前
0
0
SQL中的case when then else end用法

Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女'ELSE '其他' END--Case搜索函数CASE WHEN sex...

牛奋Debug
27分钟前
0
0
log4j2发送消息至Kafka

title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知。做了一番调研后才发现log4j2默认有支持将日志发送到kaf...

微笑向暖wx
36分钟前
1
0
LINUX中如何查看某个端口是否被占用(转发)

LINUX中如何查看某个端口是否被占用 之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 33...

覃大光
今天
1
0
JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能

JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中。 JBolt的详细使用教程请移步到这里 =====版本1.5.0 更新内容 2018年10月13日10:41:52===== 注意...

山东-小木
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部