2012-01-12 6 views
2

최근 Tango 라이브러리를 사용하여 D 버전 1을 배우기 시작했습니다. 나는 tango.io.Stdout을 감싸는 작은 클래스 Dout을 작성하기로 결정했다. 단, 더 좋은 C++의 << 스타일 출력을 위해서는 opShl을 오버라이드한다. 내 구현과 같이이다 : D 모듈에 의해 인쇄되는 모듈 이름 파괴자

// dout.d 
module do.Dout; 

import tango.io.Stdout; 

class Dout 
{ 
    public static Dout opShl(T) (T arg) 
    { 
     stdout(arg); 
     return new Dout; 
    } 

    public static Dout newline() 
    { 
     stdout.newline; 
     return new Dout; 
    } 
} 

그리고 주에서

, 나는과 같이, Dout.opShl()에 대한 간단한 전화를합니다.

Enter 키를 누른 후 main을 종료하면 "do.Dout.Dout"텍스트가 인쇄됩니다. 코드를 단계별 후,이 텍스트는 어셈블리 명령어에 인쇄되는 것을 발견 do.Dout의 소멸자가 호출되고

00406B5C call __moduleDtor (40626Ch)

하는.

내 질문은 왜 모듈을 주전산기에서 인쇄 할 수 있습니까?이 동작을 중지하려면 어떻게해야합니까?

+2

오프 주제이지만 여전히 관련이 없습니다 - D1이 실행되지 않습니다. 더 발전시켜야한다. D 버전 2는 미래입니다. D를 배우고 싶다면 그 버전을 대신 선택하는 것이 좋습니다. Tango를 D2로 이식하는 프로젝트가 있으므로 Tango를 배우는 데 드는 시간은 낭비가되지 않을 것입니다. 시각. – DejanLekic

+0

참; 나는 Phobos에 Tango를 사용하고 싶기 때문에 특별히 D1을 사용하기로 결정했습니다. C + + 백그라운드에서 오는, 나는 탱고가 더 가까운 성냥 일 것이라고 생각했다. D2가 안정되면 확실히 전환 할 것입니다. – Meta

+0

이것이 재미있을 수도 있지만 표준 왼쪽 시프트 연산자에 과부하가 걸리지 않도록하십시오. 또한 D1은 2013 년까지 개발 될 것입니다. –

답변

3

Dout << Dout.newline;합니다 (newline 속성 호출) 새로운 라인을 인쇄 한 후 Dout 객체의 사람이 읽을 수있는 문자열을 인쇄하려하기 때문에 "do.Dout.Dout는"인쇄 된 이유는 (이 opShl!Dout()에 전달 된 후) 당신이 가까이되는

__gshared Doutclass Dout = new Doutclass; 

class Doutclass 
{ 
    public Dout opShl(T) (T arg) 
    { 
     static if(T == NLine){ 
      stdout.newline;//if nl is passed do newline 
     }else{ 
      stdout(arg); 
     } 
     return this; 
    } 

    struct NLine{}//this might need a dummy field to stop compiler complaints 
    public static NLine newline() 
    { 
     return NLine(); 
    } 
} 

했어야

)

다음 출력이 플러시 때문에 만 파괴하는 동안 볼 C 스타일 (Dout은 전역 객체이고 은 다시 생성되지 않습니다. 각각의 호출에서, 개행은 개행을 추가하는 외에도 출력을 플러시하는 특수한 구조체입니다)

+0

DMD 1.0을 사용하여 __gshared를 사용할 수없는 것 같습니다. 2.0 기능입니까? 문서는 공식 웹 사이트에 없습니다. – Meta

+0

예, D2 기능 검사입니다. __gshared없이 할 수있는 http://www.d-programming-language.org/migrate-to-shared.html입니다. –