2011-12-25 9 views
13

इस बार मैं alias का उपयोग कर रहा हूं, लेकिन आज मुझे मौका मिला कि डी typedef है। दिलचस्प है, टीडीपीएल इसे तब तक कवर नहीं करता है जब तक मैं कह सकता हूं (यहां तक ​​कि D Keywords और न ही इरेटा में सूचीबद्ध)। site does cover it, लेकिन यह इसके बारे में ज्यादा बात नहीं करता है। मेरा कोड या तो संकलित करता है, लेकिन दोनों के बीच क्या अंतर है, और मुझे typedefalias पर कब उपयोग करना चाहिए?'उपनाम' और 'टाइपपीफ' के बीच क्या अंतर है?

उत्तर

19

alias मौजूदा के लिए एक नया नाम बनाता है। typedef केवल प्रकार पर काम करता है, और वास्तव में एक नए प्रकार बनाता है:

alias int A; 
typedef int B; 

pragma(msg, is(A == int)); // true 
pragma(msg, is(B == int)); // false 

typedef के साथ, आप भी डिफ़ॉल्ट प्रारंभकर्ता बदल सकते हैं:

typedef int A = 42; 

A a; 
A[5] b; 

void main() 
{ 
    assert(a == 42); 
    foreach(i; b) assert(i == 42); 
} 

alias अधिक सामान्य है। यह भी प्रतीकों के साथ काम करता है:

import std.stdio; 
import std.conv : to; 

alias to!(string) toString; 

void main() 
{ 
    int a; 
    alias a b; 
    a = 1; 
    writeln(b); // 1 

    string s = toString(2); 
    writeln(s); // 2 
} 

alias भी प्रयोग किया जाता है जब आप अधिभार सेट मर्ज करना चाहते हैं:

import std.stdio; 

class Base 
{ 
    void foo() { writeln("base"); } 
} 

class Derived : Base 
{ 
    alias super.foo foo; // merge overload sets 

    void foo(int i) { writeln("derived"); } 
} 

void main() 
{ 
    auto a = new Derived; 
    a.foo(); // base 
    a.foo(0); // derived 
} 
स्पष्ट मर्ज बिना

, का उपयोग कर Derived का एक उदाहरण अनुमति नहीं है Base.foo बुला, क्योंकि Derived.foo डिफ़ॉल्ट रूप से इसे छुपाता है।

यह केवल कक्षाओं के लिए आवश्यक नहीं है; यदि दो अलग-अलग आयातित मॉड्यूल से कार्य एक दूसरे को अधिभारित करना है, तो उन्हें alias के साथ स्पष्ट रूप से विलय किया जाना चाहिए।

typedef बहिष्कृत किया गया है। डीएमडी संस्करण 2.057 के रूप में, typedef का उपयोग करके -d ("बहिष्कृत" के लिए) ध्वज को संकलित करने की आवश्यकता है।

This pull requestTypeDefstd.typecons मानक पुस्तकालय में typedef की कार्यक्षमता नकल के लिए एक टेम्पलेट कहते हैं।

7

'टाइपपीफ' कीवर्ड डी 1 का अवशेष है, और हमेशा इसे बहिष्कृत करने का इरादा था। डी 2.057 के रूप में, यह पूरी तरह से बहिष्कृत किया गया था। डी 2 के साथ काम करते समय आपको हमेशा उपनाम का उपयोग करना चाहिए।

+0

इसे क्यों हटा दिया गया था? – Mehrdad

+0

उपनाम एक सामान्यीकृत एलियासिंग सुविधा है; आप इसे उपनाम फ़ील्ड, फ़ंक्शंस, चर, प्रकार आदि के लिए उपयोग कर सकते हैं। यह निर्णय लिया गया था कि यह टाइपपीफ होने से बेहतर डिजाइन था जो केवल प्रकार के लिए काम करता है। इसके अलावा, टाइपिफ़ वास्तव में कीवर्ड की वास्तव में खराब पसंद है जो इसके लिए करता है। –

+0

@ ज़ोर: अजीब ... यह बहुत सहज लग रहा था (मौजूदा 'के आधार पर एक नया' प्रकार 'परिभाषित करता है) और यह वास्तव में हैंडल और कई अन्य चीजों को परिभाषित करने में बेहद उपयोगी था ... – Mehrdad

संबंधित मुद्दे