2009-07-27 5 views
5

에서 내가 만들고자하는 새 클래스의 이름을 입력하도록 요청합니다. 내 코드 :사용자 입력 받기 Ruby

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 

.

+0

덕분에, 당신이 많이 –

+2

+1 명확한 설명을 위해 나를 도와/-1'eval'을 추천합니다. – rampion

+2

프로덕션 코드에서'eval'이보기 싫다는 것에 동의합니다. 그러나, 이것은 처음부터 매우 실험적인 것으로 보인다. 이런 식으로하고 싶지 않을 것입니다. 'eval'의 이점은 초보자가 이해하기 쉽고 메타 프로그래밍에 대한 소개로 잘 작동한다는 것입니다. – troelskn

5

나는 무엇이 일어나고 있는지에 대한 설명을 위해 troelskn's answer을 좋아합니다.

매우 위험 eval을 사용하지 않도록하려면 다음을 수행하십시오

Object.const_set nameofclass, Class.new