2009-07-27 4 views
5

में उपयोगकर्ता इनपुट प्राप्त करना मैं उपयोगकर्ता को एक नई कक्षा के लिए नाम दर्ज करने के लिए कहता हूं जिसे मैं बनाना चाहता हूं। मेरा कोड है:रूबी

puts "enter the name for a new class that you want to create" 
nameofclass = gets.chomp 
nameofclass = Class.new 

यह क्यों काम नहीं करता है?

इसके अलावा, मैं उपयोगकर्ता से उस विधि का नाम दर्ज करना चाहता हूं जिसे मैं उस कक्षा में जोड़ना चाहता हूं। मेरा कोड है:

puts "enter the name for a new method that you want to add to that class" 
nameofmethod = gets.chomp 

nameofclass.class_eval do 
    def nameofmethod 
    p "whatever" 
    end 
end 

यह या तो काम नहीं करता है।

उत्तर

11

निम्नलिखित कोड:

nameofclass = gets.chomp 
nameofclass = Class.new 

के रूप में मशीन द्वारा व्याख्या है:

Call the function "gets.chomp" 
Assign the output of this call to a new variable, named "nameofclass" 
Call the function "Class.new" 
Assign the output of this call to the variable "nameofclass" 

आप देख सकते हैं, यदि आप ऊपर का पालन करें, वहाँ एक चर, जो दो बार करने के लिए आवंटित हो जाता है । जब दूसरा असाइनमेंट होता है, तो पहला खो जाता है।

आप जो करने का प्रयास कर रहे हैं, संभवतः एक नई कक्षा बनाने और इसे gets.chomp के परिणाम के समान नाम दें। ऐसा करने के लिए, आप eval इस्तेमाल कर सकते हैं:

nameofclass = gets.chomp 
code = "#{nameofclass} = Class.new" 
eval code 

अन्य तरीके भी इस रूबी किया जा रहा हैं, लेकिन eval शायद सबसे आसान समझने के लिए है।

+0

धन्यवाद, आप मुझे बाहर मदद की बहुत –

+2

+1 स्पष्ट विवरण के लिए/-1 'eval' सिफारिश करने के लिए। – rampion

+2

मुझे ध्यान रखना चाहिए कि मैं सहमत हूं कि उत्पादन कोड में देखने के लिए 'eval' बुरा है। हालांकि, यह पहली जगह में एक बहुत ही प्रयोगात्मक मामला जैसा लगता है; आप कभी ऐसा कुछ नहीं करना चाहेंगे। 'Eval' का लाभ यह है कि शुरुआत के लिए समझना आसान है, और यह मेटा-प्रोग्रामिंग के परिचय के रूप में ठीक काम करता है। – troelskn

5

मुझे troelskn's answer पसंद है जो कि कुछ घटित होने के स्पष्टीकरण के लिए है।

बहुत खतरनाक eval का उपयोग कर से बचने के लिए, इस प्रयास करें:

Object.const_set nameofclass, Class.new