2009-07-27 20 views
5

Kullanıcının oluşturmak istediğim yeni bir sınıf için bir ad girmesini istiyorum. Benim kodum:Kullanıcı girişi alma Ruby'de

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

Bu neden çalışmıyor?

Ayrıca, kullanıcıdan, o sınıfa eklemek istediğim bir yöntemin adını girmesini istemek istiyorum. Benim kodum:

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 

Bu, ya da çalışmıyor.

cevap

11

Aşağıdaki kod:

nameofclass = gets.chomp 
nameofclass = Class.new 

olarak makine tarafından yorumlanır mı:

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" 

Gördüğünüz gibi, yukarıdaki izlerseniz, iki kez atanan alır bir değişken vardır . İkinci atama gerçekleştiğinde, ilk kaybedilir.

Yapmaya çalıştığınız şey, muhtemelen yeni bir sınıf oluşturmak ve buna gets.chomp sonucuyla aynı adı vermek. Bunu yapmak için, eval kullanabilirsiniz: Orada başka yolları da bu varlık Yakut, ama eval muhtemelen anlamak kolay olan

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

.

+0

sayesinde, sen çok –

+2

1 net bir açıklama için bana yardım etti/-1 'eval' önermek için. – rampion

+2

Dikkat etmeliyim ki 'status'un üretim kodunda görmek kötü olduğuna katılıyorum. Ancak, bu ilk etapta çok deneysel bir durum gibi görünüyor; Hiç böyle bir şey yapmak istemezsin. “Değerlendirmenin” yararı, yeni başlayanlar için anlaşılması kolay ve meta-programlamaya giriş olarak iyi çalışıyor. – troelskn

5

Neler olup bittiğine ilişkin açıklaması için troelskn's answer'u seviyorum.

çok tehlikeli eval kullanmaktan kaçınmak için, bu deneyin:

Object.const_set nameofclass, Class.new 
İlgili konular