2010-06-06 2 views
1

에 객체 참조 (핸들) 이름을 지정합니다 var의 핸들을 사용하여 객체를 인스턴스화하고 싶습니다.방법 그래서 나는이 같은 클래스가 동적으로 루비

value = Word.new 

확실한 방법이 있습니까? 모자 야!

감사합니다. - 당신은 정말 다른 데이터 구조를 필요로 일을 해결하기 위해 eval을 사용하지 않아야합니다

array.each do |value| 
    eval "#{value} = Word.new" 
end 

그러나 이것은 당신이 원하는 무엇을 확인 : 동적 변수 이름으로 일을 할당하려면

+0

꽤 이해가 안 돼요. 당신은 "var의 핸들을 사용하여 객체를 인스턴스화하고 싶다"고 말하지만, 그것은 나에게 아무런 의미가 없다. 그게 무슨 뜻인지 분명히 알 수 없다면, 적어도 당신이 기대하는 효과에 대해 설명해 주시겠습니까? – Chuck

+1

클래스를 만들려면'class Word; 끝내지 말고'def word; 끝 ' – horseyguy

+0

네, 고마워요. 루비를 처음 접했을 때 약간 뇌가 튀어 나온 결과였습니다. :) – RetroNoodle

답변

2

, 당신은 eval 같은 것을 사용합니다 eval로 생성 된 에러를 디버그하기가 어렵고, 원하지 않는 동작을 쉽게 일으킬 수 있기 때문입니다. 예를 들어, 당신이 정말로 원하는 수있는 것은 Word 객체의 톤 네임 스페이스를 오염되지 않습니다 예를

words = {}  
array.each do |value| 
    words[value] = Word.new 
end 

를 들어, 단어와 연관된 오브젝트의 해시입니다.

+1

자신이 많은 문제를 일으키지 않는 한 절대적으로 첫 번째 것은하지 마십시오. – Chuck

+0

Ahh는 Peter와 Chuck에게 감사드립니다. 나는 그런 식으로 생각하지 않았습니다. 예 아픈 두 번째 막대기 - 그것은 훨씬 똑똑하게 보이고 실제로 더 많은 것을 할 수있게 해줍니다. 각 "값"(vars)을 Word 개체로 사용하는 방법이 필요했습니다. 값뿐만 아니라 메소드도 필요했기 때문에 값 해시는 작동하지 않습니다. 그래서 객체의 해시 - 빛나는 - 감사합니다! – RetroNoodle

2

작업 할 데이터 구조에 따라, 당신은 또한이 작업을 수행 할 수 있습니다 :

# will give you an array: 
words = array.map { |value| Word.new(value) } 

# will give you a hash (as in Peter's example) 
words = array.inject({}) { |hash, value| hash.merge value => Word.new } 

# same as above, but more efficient, using monkey-lib (gem install monkey-lib) 
words = array.construct_hash { |value| [value, Word.new ] } 
관련 문제