[D语言] DMD 0.167发布

这个版本实现了计划已久的数组直接量。

import  std . stdio;

void main(){
  {
    static 
int [] arr  =  [ 1 , 2 , 3 , 4 , 5 ];
    writefln(typeid(typeof(arr[
0 ])));
    writefln(arr);
  }
  {
    static float[] arr 
=  [1f , 1 , 3 , 4 , 5 ];
    writefln(typeid(typeof(arr[
0 ])));
    writefln(arr);
  }
  {
    static char[][] arr 
=  [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " ];
    writefln(typeid(typeof(arr[
0 ])));
    writefln(arr);
  }
}

数组类型由第1个元素类型决定,类型不匹配将会产生编译错误。

接着是多维数组:

import  std . stdio;

void main(){
  static 
int [][] arr  =  [[ 1 , 2 , 3 , 4 ] ,  [ 4 , 5 , 6 ] ,  [ 7 , 8 ]];
  
foreach ( int []  sub ; arr){
    
foreach ( int  i;  sub ){
      writefln(i);
    }
  }
}


另一个特性是更强的typedef。原有的typedef强类型在某些情况下会产生混乱。

下面的代码摘自 http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.bugs&artnum=3843

import  std . stdio;

typedef 
int  Int1;
typedef 
int  Int2;

void show(Int1 v) {
     writefln(
" Int1: %d " ,  v);
}

void show(Int2 v) {
     writefln(
" Int2: %d " ,  v);
}

void show(
int  i) {
     writefln(
" int: %d " ,  i);
}

void show(long l) {
     writefln(
" long: %d " ,  l);
}

void main() {
     Int1 value1 
=   42 ;
     Int2 value2 
=   69 ;

     show(value1 
+  value2);
     show(value2 
+  value1);
     show(
2   *  value1);
     show(value1 
*   2 );
     show(value1 
+  value1);
     show(value2 
-  value2);
     show(value1 
+   2 );
     show(
3   +  value2);

     long l 
=   23 ;
     show(value1 
+  l);
     show(l 
+  value2);

     short s 
=   105 ;
     show(s 
+  value1);
     show(value2 
+  s);
}

如上面代码所示。typedef定义出来的类型和原有类型的相同形式重载函数可以共存,这可以完成更强类型的重载,C++的重载还不能实现这个。

这个强类型的typedef好像原本就支持,大概是运算结果类型比较模糊。

好处是显页易见的。比如有一个Time和TimeInterval类型,它用来表示绝对时间或相对时间间隔;另有一个输出函数用来显示结果。

import  std . stdio;
import  std . string;

typedef long 
Time ;
typedef long TimeInterval;

void output(
Time  t){
  writefln(
" Time:  "   ~  toString(cast(long)t));
}
void output(TimeInterval t){
  writefln(
" Interval:  "   ~  toString(cast(long)t));
}
void main(){
  
Time   time   =  cast( Time ) 100 ;
  TimeInterval interval 
=  cast(TimeInterval) 100 ;
  output(
time );
  output(interval);
}

是的,使用上麻烦了很多,因为我们试图用一个数值类型去表示多个矢量类型。

这里Time time = cast(Time)100不再只是100这个简单的数值,它还携带了Time这个类型。TimeInterval interval = cast(TimeInterval)100也不只是100这个数值,我们给它赋予了时间间隔的含义。

还可以想像得更开阔一些,用它定义时间、长度、面积、加速度、速度、温度等,重载一些计算函数(可惜D还不支持全局操作符重载),这样就方便完成一些物理量的运算了,而且类型得到检查,速度加一个整数值结果还是速度,速度乘时间得到的是长度,时间减时间得到的是时间间隔,速度加时间将产生编译错误。。。。。。神奇的是这些类型可能都是一些简单类型,我相信它至少可以保证运行效率不会太低。当然你用C++类也可以完成这些,并且利用编译器优化让它的效率保持最高,甚至内联的结果就是简单类型的运算,我还是更愿意使用这简单的类型来typedef。当然这可能需要写大量重复的函数重载形式,没有关系,我想使用模板和mixin应该可以简化这一过程,而且会有相当多的家伙们愿意使用这种麻烦的形式来获得更“正确”的编译检查。


所以说,D语言的typedef的意义其实就是实现了矢量类型。



又多想了一点。

强类型要,语法糖也应该要。是不是可以借鉴一下ruby的语法,实现这种调用呢?

Length  l  =   1 . cm;
=   1 . m;
Time  t  =   Time . now;
TimeInterval i 
=   3 . hours;

免去了一些初始化的麻烦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值