2009-06-29 17 views
5

यह एक नौसिखिया सवाल है क्योंकि मैं रूबी को अपने आप सीखने का प्रयास कर रहा हूं, इसलिए माफी माँगने पर माफी मांगती है!रूबी का उपयोग करने में असमर्थ

मैं क्यों है के उदाहरण के माध्यम से पढ़ रहा हूँ (मार्मिक) गाइड लाल और अध्याय 4 में हूँ मैं code_words wordlist.rb एक फ़ाइल बुलाया

मैं एक फ़ाइल को खोला और के रूप में पहली पंक्ति टाइप किया में हैश लिखे गए

C:/MyCode/MyRubyCode/filecoder 'wordlist.rb' और नीचे

#Get evil idea and swap in code 
print "Enter your ideas " 
idea = gets 
code_words.each do |real, code| 
    idea.gsub!(real, code) 
end 

#Save the gibberish to a new file 
print "File encoded, please enter a name to save the file" 
ideas_name = gets.strip 
File::open('idea-' + ideas_name + '.txt', 'w') do |f| 
    f << idea 
end 

मुझे इस कोड को निष्पादित, यह निम्न त्रुटि संदेश के साथ विफल के रूप में कोड के बाकी की आवश्यकता है। आरबी: 5: अपरिभाषित स्थानीय चर या के लिए मुख्य विधि `code_words 'एड: ऑब्जेक्ट (NameError)

मैं उपयोग Windows XP और रूबी संस्करण रूबी 1.8.6

मैं जानता हूँ कि मैं एक क्लासपाथ की तरह कुछ की स्थापना की जानी चाहिए, लेकिन यकीन नहीं कहां/कैसे करें!

अग्रिम में बहुत धन्यवाद!

उत्तर

1

मुझे लगता है कि समस्या यह हो सकती है कि किसी अन्य संदर्भ में कोड निष्पादित करने की आवश्यकता हो, इसलिए रनटाइम चर आवश्यकतानुसार उपलब्ध नहीं है।

CodeWords = { :real => 'code' } 

कि हर जगह उपलब्ध हो जाएगा:

क्या आप की कोशिश कर सकते यह एक निरंतर कर रही है।

Here चर स्कोप आदि

5

सभी फ़ाइलों की उच्च-स्तरीय उसी संदर्भ में क्रियान्वित कर रहे हैं, वहीं प्रत्येक फ़ाइल स्थानीय चर के लिए अपने स्वयं स्क्रिप्ट संदर्भ है पर कुछ पृष्ठभूमि है। दूसरे शब्दों में, प्रत्येक फ़ाइल में स्थानीय चर का अपना सेट होता है जिसे उस फ़ाइल में एक्सेस किया जा सकता है, लेकिन अन्य फ़ाइलों में नहीं।

दूसरी तरफ, स्थिरांक (कोडWords), ग्लोबल्स ($ code_words) और विधियां (डीफ़ कोड_वर्ड) फाइलों में पहुंच योग्य होंगी।

कुछ समाधान:

CodeWords = {:real => "code"} 

$code_words = {:real => "code"} 

def code_words 
    {:real => "code"} 
end 

एक OO समाधान है कि निश्चित रूप से इस मामले के लिए बहुत जटिल है:

# first file 
class CodeWords 
    DEFAULT = {:real => "code"} 

    attr_reader :words 
    def initialize(words = nil) 
    @words = words || DEFAULT 
    end 
end 

# second file 
print "Enter your ideas " 
idea = gets 
code_words = CodeWords.new 
code_words.words.each do |real, code| 
    idea.gsub!(real, code) 
end 

#Save the gibberish to a new file 
print "File encoded, please enter a name to save the file" 
ideas_name = gets.strip 
File::open('idea-' + ideas_name + '.txt', 'w') do |f| 
    f << idea 
end 
0

एक आसान तरीका कोड शब्द को बचाने के लिए Marshal.dump सुविधा का उपयोग करने होगा ।

# Save to File 
code_words = { 

'starmonkeys' => 'फिल और पीट, न्यू रैह के उन कांटेदार कुलपति', 'गुलेल' => 'Chucky जाना-जाना', 'firebomb' => 'हीट-जीवन रक्षक' , 'नाइजीरिया' => "न्यूयॉर्क एंड जेरी की क्लिनिंग (डोनट्स के साथ)", 'kabosh पर डाल' => की शुरुआत में अब }

# Serialize 
f = File.open('codewords','w') 
    Marshal.dump(code_words, f) 
f.close 

'पर केबल बॉक्स रखो' अपने फ़ाइल आप इसे डाल देंगे:

# Load the Serialized Data 
code_words = Marshal.load(File.open('codewords','r')) 
0

यहाँ यकीन है कि आप हमेशा अपने ऐप जैसा निर्देशिका में किसी ऐसी फ़ाइल के शामिल कर सकते हैं बनाने के लिए आसान तरीका है, बयान की आवश्यकता से पहले इस डाल

$:.unshift File.dirname(__FILE__) 

$: वैश्विक चर "CLASSPATH"

का प्रतिनिधित्व करता है
1

मैं सिर्फ वही उदाहरण देख रहा था और एक ही समस्या थी। मैंने जो किया वह code_words से $code_words दोनों में परिवर्तनीय नाम बदल गया था।

इससे यह एक वैश्विक चर बना देगा और इस प्रकार दोनों फाइलों द्वारा सही होगा?

मेरा प्रश्न है: क्या यह स्थिर बनाने और CodeWords = { :real => 'code' } लिखने के बजाय यह एक आसान समाधान नहीं होगा या ऐसा करने का कोई कारण नहीं है?

+0

मेरे भगवान ने यह काम किया !! मैं एक ही समस्या पर था (अब कुछ घंटों के लिए) और एक ही बात सोच रहा था, सिर्फ कोड_वर्ड को वैश्विक चर बना रहा था। उत्तर को समझने के लिए सबसे स्पष्ट, सबसे संक्षिप्त, सबसे आसान आपूर्ति करने के लिए इसे कुछ हद तक अंक के साथ छोड़ दें। इनमें से कोई भी किसी दिए गए उत्तर को समझने या समझने की कोशिश नहीं करता है, कोड ब्रेवटी का एक सीधा, सरल उपयोग। धन्यवाद! ... @ red क्या आपके पास कट्टरपंथी अभ्यासों की अन्य भूमिमार्गों के लिए कोई चेतावनी संकेत है? – Padawan

+0

इसे काम करने के लिए, मुझे 'आवश्यकता' को 'requ_relative' में बदलना पड़ा। यहां दोनों के बीच अंतर है: http://stackoverflow.com/questions/3672586/what-is-the-difference-between-require-relative-and-require-in-ruby – Padawan

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