2010-08-18 6 views
5

जहां तक ​​मैं समझता हूं, टीसीएल में यदि आप किसी फ़ंक्शन में नामित सरणी पास करना चाहते हैं, तो आपको कॉलर के ऊपरी दायरे को upvar कमांड बॉली के भीतर कमांड तक पहुंचना होगा। क्या यह टीसीएल में सरणी पास करने का एकमात्र तरीका है?टीसीएल में कार्यों के लिए गुजरने वाले सरणी। केवल ऊपर उठाओ?

उत्तर

5

other ways हैं, जैसे इसे पहले सूची में परिवर्तित करना (array get और array set के माध्यम से)।

9

जैसा कि माइकल ने इंगित किया है, कई तरीके हैं, साथ ही एक विकी पेज जो इसकी चर्चा करता है। बस यहां उसकी कुछ जानकारी के लिए, कुछ विकल्प हैं:

तक Upvar

proc by_upvar {&arrName} { 
    upvar 1 ${&arrName} arr 
    puts arr(mykey) 
    set arr(myotherkey) 2 
} 
set myarr(mykey) 1 
by_upvar myarr 
info exists myarr(myotherkey) => true 
  • परिणाम सरणी में परिवर्तन में फोन करने वाले

सरणी से ही देख रहे हैं प्राप्त करें/सेट करें

proc by_getset {agv} { 
    array set arr $agv 
    puts arr(mykey) 
    set arr(myotherkey) 2 
    return [array get arr] 
} 
set myarr(mykey) 1 
array set mynewarr [by_upvar myarr] 
info exists myarr(myotherkey) => false 
info exists mynewarr(myotherkey) => true 
  • परिणाम सरणी में परिवर्तन में फोन करने वाले
  • ही एक तंत्र आप केवल सरणी के मूल्य, आप कर सकते थे में गुजर रहे हैं एक सरणी
+0

आपके by_upvar proc में एम्परेंड के साथ क्या हो रहा है? टीसीएल वाक्यविन्यास नहीं है। –

+0

@glenn जैकमैन: "टीसीएल वाक्यविन्यास नहीं"? बकवास! सब कुछ टीसीएल वाक्यविन्यास है :-)। चूंकि परिवर्तनीय नाम किसी भी स्ट्रिंग हो सकते हैं और किसी अन्य भाषा में एक चर के पते को इंगित करने के लिए उपयोग किया जाता है, यह एक उदार अर्ध-अर्ध-स्वयं-दस्तावेज तरीका बनाता है जो इसे उपर के लक्ष्य के रूप में अस्वीकार कर देता है। मजेदार कैसे ओह-इतने सालों के बाद मैंने कभी सोचा नहीं था; मैं आमतौर पर _ या fooVar (upvar $ fooVar foo) का उपयोग करता हूं। –

+0

ठीक है, सच है। मैं आमतौर पर "वर्नाम" का उपयोग करता हूं। हालांकि upvar कमांड में एक त्रुटि है: त्रुटि '(ए -> $ {& a}) के लिए खाते में अपडेट किया गया 'upvar 1 $ और arrName arr' –

2

वापस जाने के लिए इस्तेमाल किया जा सकता द्वारा देखा जा रहा है इसके बजाए एक शब्दकोश में पास करें (संकेत: array get एक सरणी को एक शब्दकोश मान में क्रमबद्ध करता है) और इसमें dict कमांड का उपयोग करने के लिए कमांड का उपयोग करें। लेकिन यदि आप लाइव वैल्यू तक पहुंच चाहते हैं, तो upvar निश्चित रूप से सबसे आसान है। यह भी एक बहुत तेज तकनीक है; यह upvar के बाद परिवर्तनीय पहुंच के दौरान एक सूचक के अतिरिक्त ट्रैवर्सल को संकलित करता है।

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