2013-03-25 2 views
0

를 사용하여 조건부 과제를 수행, 내가 좋아하는 속성 이름의 목록을 가지고 다음과 같은 : 나는 반사를 사용하여 목록을 반복하고 싶습니다 루비 루비 반사

names = [ 
    :foo, 
    #... 
] 

는 재산에 조건 할당을 수행 이름. 어떻게이 사용 루비의 반사를 달성 할 수

for name in names 
    #use local variable "name" to perform assignment using reflection 
end 

을 :

self.foo ||= 0

나는 이런 식으로 뭔가 뭔가를하고 싶습니다 : 그래서, 예를 들어, 오히려 이것보다, 이는 반사를 사용하지 않습니다 ?

답변

2
foo.bar ||= baz 

거의 비슷 그것은 내가 생각하기에, 완전히 동일하지만 사용 목적에 충분히 가까이 아니다

foo.bar || foo.bar = baz 

이다. 따라서

names.each do |name| send(name) || send(:"#{name}=", 0) end 

은 원하는대로해야합니다. 물론 이해하기 쉽도록

names.each do |name| send(:"#{name}=", 0) if send(name) end 

과 같습니다.

2
names.each { |name| self.instance_variable_set("@#{name}", 0) } 

은 아마도 사용자가해야 할 일에 대한 첫 번째 대략적인 값일 것입니다.

+0

의미가 'self.foo || = 0'과 어떻게 의미가 비슷하거나 다른지 설명 할 수 있습니까? 예를 들어, 여전히 메시지 전달 "전송"의미론을 사용합니까, 아니면이를 우회합니까? – jbeard4

+0

instance_variable_set은 변수가 이미 존재하지 않으면 정의합니다. 그래서 사실 이것은 속성 주입입니다; 엄격하게 소유하지 않은 속성 목록을 전달하는 속성 목록에 속성이 있으면 instance_variable_set이 신경 쓰지 않습니다. instance_variable_set은 '광역'으로 설정된 호스와 풀 스피드로 설정된 펌프로 클래스의 앞 잔디밭에 주차 된 불쌍한 페인트 트럭입니다. 즉, instance_variable_set이 수업을 즐겁게 바꿀 것입니다 너를 위해서. – mcfinnigan

+1

'self.foo'를 설정하는 것은'@ foo'를 설정하는 것과 다를 수 있습니다. –