일반적으로 문자열에 이름이있는 객체에 대한 참조를 얻으려면 어떻게해야합니까?
보다 구체적으로, 매개 변수 이름 목록이 있습니다 (멤버 변수-동적으로 빌드되어 직접 참조 할 수 없음).
각 매개 변수는 from_s
메소드 도있는 객체입니다 .
다음과 같은 작업을하고 싶습니다 (물론 작동하지 않습니다 …).
define_method(:from_s) do | arg |
@ordered_parameter_names.each do | param |
instance_eval "field_ref = @#{param}"
field_ref.from_s(param)
end
end
답변
이를 달성하는 가장 관용적 인 방법은 다음과 같습니다.
some_object.instance_variable_get("@#{name}")
+
또는 사용할 필요가 없습니다 intern
. 루비는 이것을 잘 처리 할 것입니다. 그러나 다른 개체에 도달하여 해당 ivar를 빼 내면 캡슐화가 손상되었을 가능성이 상당히 높습니다.
ivar에 명시 적으로 액세스하려는 경우 올바른 방법은 액세스 자로 만드는 것입니다. 다음을 고려하세요:
class Computer
def new(cpus)
@cpus = cpus
end
end
이 경우 Computer.new
를 사용 instance_variable_get
하면 을 사용 하여 @cpus
. 하지만 만약 당신이 이것을하고 있다면, 당신은 아마도 @cpus
공개를 의미 할 것입니다 . 당신이해야 할 일은 :
class Computer
attr_reader :cpus
end
이제 할 수 있습니다 Computer.new(4).cpus
.
참고 당신은 다시 할 수 있는 기존의 클래스를하고 판독기에 개인 바르합니다. 접근자는 방법 일 뿐이므로 다음을 수행 할 수 있습니다.Computer.new(4).send(var_that_evaluates_to_cpus)
답변
인스턴스 변수 이름에서 인스턴스 변수를 얻으려면 다음을 수행하십시오.
name = "paramName"
instance_variable_get(("@" + name).intern)
이것은 인스턴스 변수의 값을 반환합니다 @paramName