2010-07-14 17 views
8

& डीबगिंग विकसित करते समय, कभी-कभी मैं चाहता हूं कि मैं 1-लाइनर लिख सकूं जो नामों को छोड़ देता है, प्रकार & चर के समूह के मान। समस्या यह है कि मुझे नहीं पता कि एक चर के नाम का उपयोग कैसे किया जाए, अगर मैं बिल्कुल भी कर सकता हूं।स्थानीय वैरिएबल का नाम प्राप्त करें

foo = 1 
bar = "42" 
baz = Hash.new 

[foo, bar, baz].each do |v| 
    puts "#{v.???} = (#{v.class}) #{v}" 
    end 

मैं इस कार्यक्रम के उत्पादन की मनचाही संख्या के लिए कुछ की तरह:

foo = (Fixnum) 1 
bar = (String) 42 
baz = (Hash) ... 

मैं क्या ??? से ऊपर होना चाहिए पता नहीं है

यहाँ एक पहला प्रयास है। क्या यह किया जा सकता है?

+0

आप अपने तर्क रिवर्स और ग्लेन समाधान के साथ जाना जा सका: http://stackoverflow.com/questions/58482/ruby-get-a-variables-name मेरे समझ है कि आप एक वेरिएबल का नाम नहीं मिल सकता है। – Pat

+0

@Pat: यह प्रभावी रूप से लेवेन्टिक्स के समाधान के समान है, लेकिन विभिन्न वाक्यविन्यास के साथ। तो मुझे लगता है कि जवाब हाँ है। :) –

+0

मुझे यकीन नहीं है कि उदाहरणकर्ता एकाधिक चर को संभाल सकता है, लेकिन उदाहरणकर्ता आपको 'शो (वेरिएबल)' कॉल करने की अनुमति देता है, आपको वैरिएबल और उसके मान का नाम देता है। http://github.com/quackingduck/exemplor –

उत्तर

13
foo = 1 
bar = "42" 
baz = Hash.new 

%w(foo bar baz).each do |vn| 
    v = eval(vn) 
    puts "#{vn} = (#{v.class}) #{v}" 
end 

लेकिन यह निश्चित रूप से आपकी सहायता नहीं करता है यदि आप 1 तर्क के साथ एक विधि चाहते हैं।

+0

शानदार! धन्यवाद! काश मैं इसे दो बार ऊपर उठा सकता हूं। –

+2

मुझे इसके लिए बहुत अच्छा समाधान मिला: http://thinkrelevance.com/blog/2009/09/23/quick-and-easy-logging-with-logbuddy.html – Leventix

3

नहीं, क्योंकि foo/bar/baz आपके कोड में आवृत्ति चर नहीं हैं। वे स्थानीय चर हैं (उदाहरण चर @ के साथ शुरू होते हैं)। वहाँ उदाहरण चर और Object#instance_variables विधि के साथ यह करने के लिए एक तरह से, हालांकि:

@foo = 1 
@bar = 2 
@baz = 3 

instance_variables.each do |var| 
    value = instance_variable_get var 
    puts "#{var} = (#{value.class}) #{value}" 
end 

# outputs: 
# @foo = (Fixnum) 1 
# @bar = (Fixnum) 2 
# @baz = (Fixnum) 3 

उदाहरण चर के सभी के माध्यम से एक विशेष उदाहरण चर, पाश के नाम प्राप्त करने के लिए जब तक आप उस मेल खाता एक मूल्य के साथ मिल आपका उदाहरण चर।

4

यहां पर डीबग कोड का एक छोटा सा कोड है जो मैं पूरे स्थान पर उपयोग करता हूं (मैं इसे एक अलग फ़ाइल में चिपकता हूं ताकि जहां भी आवश्यक हो, इसकी आवश्यकता हो)। इसका इस्तेमाल दो तरीकों से किया जा सकता है। एक या अधिक मूल्यों को पारित किया गया, यह बस उनका निरीक्षण करता है और परिणाम को $ stderr लिखता है। लेकिन एक ब्लॉक पारित किया जो एक या एक से अधिक चीजें देता है, यह उन्हें उनके नाम के साथ लिखता है।

#!/usr/bin/ruby1.8 

def q(*stuff, &block) 
    if block 
    s = Array(block[]).collect do |expression| 
     value = eval(expression.to_s, block.binding).inspect 
     "#{expression} = #{value}" 
    end.join(', ') 
    $stderr.puts s 
    else 
    stuff.each do 
     |thing| $stderr.print(thing.inspect + "\n") 
    end 
    end 
end 

i = 1 
q i  # => 1 
q {:i} # => i = 1 

name = "Fred" 
q [name, name.length]   # => ["Fred", 4] 
q {[:name, 'name.length']} # => name = "Fred", name.length = 4 

नोट: q समारोह, और अधिक, अब cute_print मणि में उपलब्ध है।

2
foo = 1 
bar = "42" 
baz = Hash.new 

Varspec = Struct.new(:name, :type, :value, :inspect_str) do 
    def to_s 
    "#{name} = (#{type}) #{inspect_str}" 
    end 
end 

lvars = local_variables.map {|lvar| 
    lvar = lvar.to_s 
    val = eval(lvar) 
    val = val.dup rescue val 
    Varspec.new(lvar, val.class, val, val.inspect) 
} 

puts lvars 
# baz = (Hash) {} 
# bar = (String) "42" 
# foo = (Fixnum) 1 

या, आप एक डिबगर इस्तेमाल कर सकते हैं। आखिरकार, उनका आविष्कार किया गया था।

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