D語言
範例 > 範例3

本例繁多的註解顯示出D語言與C++ 的不同之處，以及仍然保留的方面。
#!/usr/bin/dmd -run
/* 支援sh風格的script語法！*/
/* D語言的Hello World
 * 進行編譯：
 *   dmd hello.d
 * 或進行最佳化：
 *   dmd -O -inline -release hello.d
 * 或產生文件：
 *   dmd hello.d -D
 */

import std.stdio;       // 參照常用的I/O例行工作。
alias char[] string;    // 以相容舊的編譯器；新的編譯器中已隱含定義

int main(string[] args)
{
    // 'writefln' (寫入-格式化-行，Write-Formatted-Line)即型態安全的「printf」
    writefln("Hello World, "             // 自動連結的字串文字
             "Reloaded");

    // 字串即字元的動態陣列「char[]」，別名為「string」
    // 自動的型態推斷，以及內建的foreach
    foreach(argc, argv; args)
    {
        auto cl = new CmdLin(argc, argv);                       // 支援OOP
	writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);    // 使用者定義的類別屬性。

	delete cl; 	              // 垃圾回收或顯示的記憶體管理——由你自己選擇
    }

    // 巢狀結構、類別和函式
    struct specs
    {
        // 所有的變數會在執行時期自動初始化為0
        int count, allocated;
 	// 不過你可選擇避開陣列的初始化
        int[10000] bigarray = void;
    }

    specs argspecs(string[] args)
    // 可選用的（內建）函式契約。
    in
    {
        assert(args.length > 0);                   // 內建assert
    }
    out(result)
    {
        assert(result.count == CmdLin.total);
        assert(result.allocated > 0);
    }
    body
    {
        specs* s = new specs;
        // 不需要「->」
        s.count = args.length;  // 「length」屬性是元素的數量。
        s.allocated = typeof(args).sizeof; // 原生型態內建的屬性
 	foreach(arg; args)
 	    s.allocated += arg.length * typeof(arg[0]).sizeof;
 	return *s;
    }

    // 內建字串和普通的字串操作，例如「~」是連結。
    string argcmsg = "argc = %d";
    string allocmsg = "allocated = %d";
    writefln(argcmsg ~ ", " ~ allocmsg,
	    argspecs(args).count,argspecs(args).allocated);
    return 0;
}
 
/**
 * 儲存單獨命令列參數
 */
class CmdLin
{
    private
    {
        int _argc;
        string _argv;
        static uint _totalc;
    }
 
    public:
        /**
         * 物件的建構子。
         * 參數：
         *   argc = 參數的序列計數。
         *   argv = 參數內文。
         */
        this(int argc, string argv)
        {
            _argc = argc + 1;
            _argv = argv;
            _totalc++;
        }

        ~this() // 物件的解構子
        {
            // 本例中不做任何事。
        }

        int argnum() // 屬性，可返回參數數目
        {
            return _argc;
        }

        string argv() // 屬性，可返回參數內文
        {
            return _argv;
        }

        wstring suffix() // 屬性，可返回序數後綴
        {
            wstring suffix; // 內建Unicode字串（UTF-8，UTF-16，UTF-32）
            switch(_argc)
            {
                case 1:
                    suffix = "st";
                    break;
                case 2:
                    suffix = "nd";
                    break;
                case 3:
                    suffix = "rd";
                    break;
                default:  // 'default' is mandatory with "-w" compile switch.
                    suffix = "th";
            }
            return suffix;
        }

        /**
          * 靜態屬性，如同在C++ 或Java中，
          * 適用於類別物件，而不是實體。
          * 返回：己加入的命令列參數總數。
          */
        static typeof(_totalc) total()
        {
            return _totalc;
        }

        // 類別不變量，任何方法在執行之後，這些必須為真。
        invariant ()
        {
            assert(_argc > 0);
            assert(_totalc >= _argc);
        }
}