2009-07-27 19 views
5

Pytam użytkownika o wprowadzenie nazwy nowej klasy, którą chcę utworzyć. Mój kod to:Uzyskiwanie danych wprowadzanych przez użytkownika W Ruby

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

Dlaczego to nie działa?

Ponadto chcę poprosić użytkownika o podanie nazwy metody, którą chcę dodać do tej klasy. Mój kod to:

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 

To również nie działa.

Odpowiedz

11

Poniższy kod:

nameofclass = gets.chomp 
nameofclass = Class.new 

jest interpretowany przez maszynę jak:

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" 

Jak widać, jeśli się z powyższym, istnieje jedna zmienna, która zostanie przypisana do dwóch razy . Kiedy nastąpi drugie zadanie, pierwszy zostaje utracony.

Co próbujesz zrobić, to prawdopodobnie stworzyć nową klasę i nazwać ją tak samo jak wynik gets.chomp. Aby to zrobić, można użyć eval:

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

Istnieją inne sposoby też, co jest Ruby, ale eval jest chyba najłatwiejszy do zrozumienia.

+0

dzięki, że pomogłeś mi dużo –

+2

+1 do jasnego wyjaśnienia/-1 dla polecenia 'eval'. – rampion

+2

Należy zauważyć, że zgadzam się, że "eval" jest nieprzyjemny do zobaczenia w kodzie produkcji. Jednak wydaje się, że jest to bardzo eksperymentalny przypadek; Nigdy nie chciałbyś zrobić czegoś takiego. Zaletą programu eval jest to, że jest on łatwy do zrozumienia dla początkujących i działa dobrze jako wprowadzenie do meta-programowania. – troelskn

5

Bardzo lubię troelskn's answer za wyjaśnienie, co się dzieje.

Aby uniknąć stosując bardzo niebezpieczną eval, spróbuj tego:

Object.const_set nameofclass, Class.new 
Powiązane problemy