2011-06-23 22 views
9

मैं एक चर है कि मैं एक बहस के लिए डिफ़ॉल्ट मान के रूप में उपयोग करना चाहते हैं मिल गया है के रूप में एक चर का उपयोग कैसे करें:एक TCL proc तर्क का डिफ़ॉल्ट मान

proc log {message {output $::output}} { 
    .... 
} 

वहाँ यह करने के लिए एक रास्ता है या मुझे अपनी proc के अंदर चर का मूल्यांकन करने की आवश्यकता है?

उत्तर

11

हां, लेकिन आप अपनी तर्क सूची के लिए घुंघराले ब्रेसिज़ ({}) का उपयोग नहीं कर सकते हैं। आप प्रक्रिया की घोषणा करते हैं उदा। इस तरह से:

proc log [list message [list output $::output]] { 
    .... 
} 

लेकिन ध्यान रखें:
चर समय था जब प्रक्रिया घोषित किया जाता है पर मूल्यांकन किया जाता है, जब यह मार डाला जाता है नहीं!

+2

+1: यह परिभाषा समय चूक के लिए एकदम सही है। प्रदान किए गए तर्कों की संख्या की जांच के लिए –

7

यदि आप एक डिफ़ॉल्ट तर्क चाहते हैं जो केवल आपके द्वारा कॉल किए जाने पर मूल्य में परिभाषित किया गया है, तो आपको और अधिक कठिन होना होगा। जब तर्कों की सूची की जाँच,

proc log {message {output ""}} { 
    if {[llength [info level 0]] < 3} { 
     set output $::output 
    } 
    ... 
} 

याद रखें, पहले एक: महत्वपूर्ण यह है कि आप info level 0 उपयोग कर सकते हैं वर्तमान प्रक्रिया कॉल करने के लिए तर्कों की सूची प्राप्त करने के लिए, और फिर आप सिर्फ इतना है कि सूची की लंबाई की जाँच है आदेश का नाम ही है।

+0

+1, केवल यह देखने के लिए जांच कर रहा है कि आउटपुट खाली स्ट्रिंग था या नहीं! खैर, आपको उपयोगी उत्तर के लिए एक +1 प्राप्त होगा, लेकिन मुझे खुशी है कि आपने इसे इस तरह से किया :) – RHSeeger

+0

उत्कृष्ट उत्तर, लेकिन इस तरह से देखें कि इस तरह से आप 'लॉग हैलो' आदेश देने वाले उपयोगकर्ता के बीच भेदभाव नहीं कर सकते "'और' लॉग हैलो '। आप डिफ़ॉल्ट आउटपुट स्ट्रिंग ("" बदल रहे हैं) को बदल सकते हैं लेकिन फिर आपको नए मान के साथ एक समान समस्या मिलती है। शायद ऐसा नहीं होता है लेकिन जब ऐसा होता है ... – Roalt

+0

@ रोटल: क्या आप उस टिप्पणी को दूसरे उत्तर पर रखना चाहते थे? मेरे साथ, आप केवल _counting_ द्वारा अंतर कर सकते हैं कि वास्तव में कितने मूल्य प्रदान किए गए थे। इट्स दैट ईजी। –

1

एक और तरीका है यह करने के लिए:

proc log {message {output ""}} { 
    if {$output eq ""} { 
     set output $::output 
    } 
}