2012-05-18 6 views
2

내가 몇 가지 코드이전역 변수에

 
$var1 = 2 
$var2 = 4 
... 

keywords = {"one" => $var1, "two" => $var2, ...} 

문제처럼 쓴 가리키고 있는지 현재의 값을 취득하는 것은 내가 keywords에 해시 때 변수에 저장된 값을 얻을 싶어하지만 루비 아무튼이다 변수가 필요할 때 변수를 다시 평가하는 것 같습니다. $var1 실행 중 변경되었습니다 그렇다면, keywords["one"] 아직도 내가 내가 먼저 가서 그 값을 잡아 그때 액세스해야하는 변수를 결정하고, 수 있도록 해시를 변경할 수있는 방법

2의 원래 값을 반환?

꽤 많은 수의 전역 변수가 있고 (배열을 사용하지 않았습니까?) 중복 case/when 또는 if/elsif 블록을 원하지 않습니다.

편집 : 더 정확한 질문은

가 될 것 "어떻게 변수가 현재 가리키고있는 값을 검색 할 수 있습니까?"

+0

해시 값을 편집하는 것이 훨씬 쉽습니다. 여분의 변수가 필요한 이유는 무엇입니까? – domvoyt

+0

변수를 제어 할 권한이 없습니다. 내가해야 할 나쁜 코드입니다. – MxyL

답변

3

일반적으로 이것은 나쁜 생각처럼 보입니다.대신 $의 var1에 그냥 [ "하나"] 해시를 업데이트하고 항상 키워드를 통해 $ var1에 액세스 업데이트하는

당신은 평가 사용할 수 있지만 그것은 좋은 해결책이 아니다 :

$var1 = 2 
$var2 = 4 
... 
keywords = {"one" => "$var1", "two" => "$var2", ...} 
$var1 = 6 
var1 = eval(keywords["one"]) # -> 6 

업데이트 : 평가합니다 전달한 코드를 가져 와서 실행합니다. 당신이 기대하는 것은 당신이 기대하는 형태라는 점에 매우주의해야합니다. 큰 보안 위험이 될 수 있습니다.

+0

+1 "이것은 나쁜 생각처럼 보입니다." – Phrogz

+0

대신 해시를 업데이트하고 싶지만, $ var1이 가리키는 내용이 업데이트되고 그 변수를 통해 값을 얻게됩니다. 그런데 그런 식으로하면 악의적 인 문자열이 평가판 호출에 전달 될 위험이 여전히 존재합니까? – MxyL

+0

@Keikoku 당신이이 답변을 받아 들여야합니다 (당신이 얻을 수있는 가장 좋은 답변이라고 확신 할 수있을만큼 충분히 기다린 후에). 당신은 경고를 받았고 이것이 거친 해킹임을 이해했지만 Ruby (의도적으로)는'eval'을 제외하고는 원하는 것을 달성 할 수있는 다른 메커니즘을 제공하지 않습니다. – Phrogz

1

변수가 이 아니며 값을 포함하면 참조입니다. 당신이 쓸 때 :

foo = 2 
bar = [foo] 
foo = 4 

를 ... 그것은 [4]bar가 발생하지 않습니다. 어떤 ~가 발생하는 것은 :

  1. 메모리에 값 2을 만들고 그것을 참조하는 변수 foo을 설정합니다.
  2. 첫 번째 슬롯이 foo (즉, 2)으로 참조되는 값을 참조하는 새 배열을 만들고 해당 배열을 참조하는 변수 bar을 설정합니다.
  3. 4 값을 메모리에 만들고 대신 foo 변수를 참조하도록 변경하십시오.

일부 개체 유형은 변경할 수 있습니다. 예를 들어 String 또는 Array의 실제 내용을 다르게 변경할 수 있습니다. 이 경우 해당 값에 대한 모든 참조는 변경 사항을 반영합니다.

foo = "hello" 
bar = [foo] 
foo[0] = "j" 
p bar  #=> ["jello"] 

그러나 숫자는 변경할 수 없습니다. 변경할 수있는 것보다 많은 수의 '핸들'을 갖고 그 번호가 다른 모든 참조를 변경하려면 변경 가능한 데이터 형식으로 숫자를 래핑해야합니다. 예를 들어 :

$var1 = "foo" 
keywords = { "one"=>$var1 } 
$var1.replace("bar") 
p keywords["one"]   #=> "bar" 

의 핵심은 다음과 같습니다 당신의 가치가 하지 번호,하지만 문자열 경우

$var1 = [2] 
keywords = { "one"=>$var1 } 
p keywords["one"][0] #=> 2 
$var1[0] = 4 
p keywords["one"][0] #=> 4 

지금, ("키워드"로 의미) 당신은 그 대신 전적으로 변이 할 수 있습니다 그 당신은 개체 자체에 대한 메서드를 호출해야합니다 (그 메서드는 개체 자체를 변경해야합니다, 새로운 개체를 반환하지 않아야합니다); 변수 할당을 사용하여이 작업을 수행 할 수 없습니다. 예를 들어 String#replace을 참조하십시오.

+0

그것은 좋은 일이지만 그의 질문에 대한 대답이 아닙니다 ... – mliebelt

+0

@mliebelt 그때가 아니었지만 지금은입니다. :) – Phrogz

+0

예, 일부 값은 변경 가능한 유형입니다. 하지만 지금은 내가 작성한 것에 기초하여 업데이트 된 값보다는 항상 원래의 값을 얻는 이유가 확실하지 않습니다. 완전히 다른 문제 일 수도 있습니다. $ var3이 문자열을 가리킨다면 문자열을 변경하면 keywords [ "three"]'는 새로운 문자열을 반환해야합니다. – MxyL

관련 문제