2009-10-06 11 views
8

मैं कैसे परिवर्तित कर सकता हूं: obj वापस def के अंदर obj नामक एक चर में?रूबी - प्रतीक से परिवर्तनीय में कनवर्ट करें

def foo(bar) 
    bar.some_method_call 
end 

foo :obj 

अद्यतन: अंतिम कोड इस से ज्यादा विस्तृत है लेकिन ...

मैं

foo :obj 
बजाय

foo obj 
कहने के लिए सक्षम होना चाहते

मैं कुछ डीएसएल-जैसी वाक्यविन्यास पर काम कर रहा हूं। और यह एक बदलाव चीजों को थोड़ा स्पष्ट पढ़ने देगा।

+0

यह आपके प्रतीक, बार अंदर का प्रतिनिधित्व किया मतलब यह है, सीधे एक उदाहरण चर से मेल खाती है:

एक अन्य विकल्प foo फोन और पारित में बाध्यकारी है? – Matt

उत्तर

0

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

+0

अद्यतन और टिप्पणियां देखें – BuddyJoe

11

आपके उदाहरण में obj किस प्रकार का चर है? यदि यह उस क्षेत्र का स्थानीय चर है जहां foo कहा जाता है, तो इसे अंदरूनी foo से एक्सेस नहीं किया जा सकता है, जब तक कि आप वर्तमान बाध्यकारी को दूसरे पैरामीटर के रूप में पास न करें।

आप उदाहरण चर @obj तक पहुँचने के लिए चाहते हैं, यह आसान है:

def foo(bar) 
    instance_variable_get("@#{bar}").length 
end 

@obj = "lala" 
foo("obj") #=> 4 
+0

ओबीजे foo के दायरे से बाहर है। +1 अच्छी जानकारी – BuddyJoe

1

आप चर या एक्सेसर विधि मतलब है? Sepp2k ने एक आवृत्ति चर के लिए नाम दिया; एक्सेसर के लिए

def foo(bar) 
    self.send(bar).some_method_call 
end 
4

आप eval इस्तेमाल कर सकते हैं

def foo(bar) 
    eval(bar.to_s).some_method_call 
end 
3

यह थोड़ा अजीब है, लेकिन अगर आप एक खाली ब्लॉक पारित करने के लिए तैयार हैं (या यदि आप एक वैसे भी गुजर रहे हैं), तो आप प्राप्त कर सकते हैं का उपयोग करें ब्लॉक से बाध्यकारी है, तो eval फोन और बाध्यकारी पारित:

def foo(symbol, &block) 
    binding = block.send(:binding) 

    eval(symbol.to_s, binding) 
end 

var = 3 

puts foo(:var) {} 

यह प्रिंट होगा 3.

वैकल्पिक रूप से, ActiveSupport में स्पष्ट रूप से कुछ बाइंडिंग.of_caller कहा जाता है जिसे आप उपयोग करने में सक्षम हो सकते हैं ताकि आपको ब्लॉक को पास न करना पड़े, लेकिन मुझे नहीं पता कि यह कितना अच्छा काम करता है।

def foo(binding, symbol) 
    eval(symbol.to_s, binding) 
end 

binding = self.send(:binding) 
var = 3 

puts foo(binding, :var) 
संबंधित मुद्दे