2009-07-27 9 views
5

Ich bitte den Benutzer, einen Namen für eine neue Klasse einzugeben, die ich erstellen möchte. Mein Code ist:Eine Benutzereingabe erhalten In Ruby

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

Warum funktioniert das nicht?

Außerdem möchte ich den Benutzer bitten, den Namen einer Methode einzugeben, die ich dieser Klasse hinzufügen möchte. Mein Code ist:

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 

Dies funktioniert auch nicht.

Antwort

11

Der folgende Code:

nameofclass = gets.chomp 
nameofclass = Class.new 

wird von der Maschine interpretiert als:

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" 

Wie Sie sehen können, wenn Sie die oben folgen, gibt es eine Variable, die zweimal zugewiesen wird, um . Wenn die zweite Zuweisung erfolgt, ist die erste verloren.

Was Sie versuchen, ist wahrscheinlich, eine neue Klasse zu erstellen und denselben Namen wie das Ergebnis gets.chomp zu geben. Um dies zu tun, könnten Sie eval:

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

Es gibt auch noch andere Möglichkeiten, dies ist Rubin, aber eval ist wahrscheinlich die am einfachsten zu verstehen.

+0

Dank, du hast mir eine Menge –

+2

+1 für klare Erklärung half/-1 für 'eval' empfehlen. – rampion

+2

Ich sollte beachten, dass ich zustimme, dass "eval" im Produktionscode unangenehm ist. Dies scheint jedoch in erster Linie ein sehr experimenteller Fall zu sein; Du würdest niemals so etwas tun wollen. Der Vorteil von 'eval' ist, dass es für einen Anfänger einfach zu verstehen ist, und es eignet sich gut als Einführung in die Meta-Programmierung. – troelskn

5

Ich mag troelskn's answer für seine Erklärung, was passiert ziemlich viel.

zu vermeiden Um die sehr gefährlich eval verwenden, versuchen Sie dies:

Object.const_set nameofclass, Class.new 
Verwandte Themen