어리석은 질문일지도 모른다고 미리 사과드립니다. 나는 내가 찾은 것을 약속하지만, 나는 올바른 것을 찾았는지 확신 할 수 없다. 저는 매우 새로운 프로그래머입니다. 루비는 저의 첫 번째 진지한 언어입니다. 지난 몇 달 동안 루비는 제게 그것을 가르쳤습니다. 또한 StackOverflow에 대한 질문을 한 번도 한 적이 없기 때문에이 질문에 대한 다른 요구 사항을 충족하고 명확하게 수용 할 수 있습니다. 다음은 질문입니다.문자열을 사용할 때 검사 할 변수가 들어있는 문자열 설정 - Ruby 1.9.3
메소드에 전달 된 값을 기반으로 다양한 API와 다양한 URL을 호출하는 분기 방법이 있습니다. 있는 그대로, 그것은 같이 보인다 :
if api == x
url = "http://url.x.com/api/#{@variable}"
elsif api == y
url = "http://url.y.com/api/public/#{@var1}_#{@var2}/#{@variable}"
등
필요한 변수는로 불리는 URL의 존재가, 각 작업 다릅니다. 요청에 사용 된 변수는 메소드 시작시 인스턴스 변수로 작성됩니다. 인스턴스 변수의 가능한 값은 큰 해시에 저장되거나 호출 자체에 의해 메소드에 전달됩니다. 해시처럼 구성되어있다 :
$globalhash =
{
"api_1" =>
{
"call_type_1" => {"info_1" => "", "info_2" => ""},
"call_type_2" => {"info_1" => "", "info_2" => ""}
},
"api_2" =>
{
"call_type_1" => {"info_1" => "", "info_2" => ""},
"call_type_2" => {"info_1" => "", "info_2" => ""}
}
}
나는이 분기 섹션은 코드에서 오랜 시간 동안 계속 것입니다이 문제 - 나는 suboptimally 그것을 한 적이 부분적으로 있기 때문에, 나는 확신한다. 분기 섹션이 없으면 내 코드가 훨씬 더 효율적이라는 것도 확신합니다. 이상적으로, 대신 분기 섹션, 나는하고 싶습니다이 발생 :
url = $globalhash[@api][@call_type]["url"]
다음은 호출 유형 및 API에 고유 한 URL 될 것이다 끌어 값 - 서식, 주소 및 기타 여러 가지를 차이가 포함되어 있습니다. 따라서 일부 값은 다음과 같습니다.
http://api.x.com/@[email protected]/@variable
http://api.y.com/public/@variable
등등. 그래서 구조가 다양하고 메서드 호출 내에 저장된 인스턴스 변수에 액세스해야하지만 동적으로 그렇게해야합니다. 문제는 내가 구현 한 모든 방법은 "global"이 실행될 때 $ globalhash가 읽힐 때 "url"에 대한 문자열의 인스턴스 변수 값을 구현하려고 시도했기 때문입니다. 무. 기본적으로 요청이 이루어질 때 변수를 확인해야합니다. 요청에 대한 post_data를 설정하는 것과 비슷한 (동일한?) 문제가 있습니다. 해시에서 설정하는 방법을 찾을 수 있다면 더 빨리 실행되는 코드를 깨끗하게 처리 할 수 있습니다. post_data는 다음과 같습니다 :
post_data = {'value' => @var1, 'value2' => @var2, 'value3' => @var3}
등입니다. post_data는 각 API 및 각 call_type에 따라 다릅니다. 값은 요청 된 변수와 다를 수 있습니다. 왠지 좋아 보이는 해시 키 - 값 쌍의 집합을 구현하고 싶습니다 : 물론, 그것이 작동해야합니다,를 제외하고
$globalhash = {"api_1" => {"call_type_1" => {"url" => "http://api.x.com/#{@variable}", "post_data" => "{'value' => @var1, 'value2' => @var2, etc.}"}}}
이 -이 참조 할 필요가있는 변수를 전무을 때 $ globalhash가 읽히고 있습니다. 이 문제를 해결하는 최선의 방법이 확실하지 않습니다.
이 프로그램은있는 그대로 동작하지만, URL과 post_data의 구조를 파악한 후 80 라인의 분기 코드를 작성하여 요청합니다.
유일한 해결책은 인스턴스 변수를 선언 한 후에 만 생성되는 분기 코드를 대체하기 위해 메서드 내에 인스턴스 해시를 만드는 것입니다. 그러나 매번 거대한 새 해시를 만드는 것은 비효율적이라는 점에서 현재의 것과 비슷한 문제가 발생할 수 있습니다.
감사합니다. 도움을 주셔서 감사합니다. 의사 코드가 받아 들여지기를 바랍니다. 제 질문을 설명하는 가장 좋은 방법입니다.
EDIT : 해결책을 찾았습니다. 코드 :
이url = eval "\"#{$globalhash["api_1"]["call_type_1"]["url"]}\""
는 [ "URL"] 참조 'http://api.x.com/# {@variable가}', 따옴표 해시 내에서 보간을 방지는 평가 기능은 큰 따옴표로두고 문자열 보간은이 시점에서 인스턴스 변수를 수집 라는. 추악한 방법이지만 내 코드를 크게 단축시켜줍니다. 자료 : https://www.ruby-forum.com/topic/3237101
그것은 귀하의 질문에 매우 어렵 이해할 수있다 ... URL에 자리 표시자를 사용합니다. 나는 그것을 바꾸거나 당신이 갖고있는 것과 당신이 필요로하거나 기대하는 것을 요약 할 것을 제안합니다. Btw. 당신은 중첩 해시가 도우미 메서드를 작성하거나'Hash # fetch'에 의존하고'KeyError' 예외를 처리하기 때문에'Hash # has_key? '로 키의 존재를 검사 할 수 있습니다. –
tl; dr : 현재 요청 된 URL과 post_data를 파악하기 위해 if 문을 80 줄로 분기하고 있습니다. 나는 그것을 대체 할 : URL = $ globalhash [@api] [ "URL"] [CALL_TYPE @] post_data = $ globalhash [@api] [@ CALL_TYPE] [ "post_data"] 또는 이와 유사한, 그러나 나는 그렇게하는 방법을 알아낼 수 없다. 기본적으로 변수를 포함하는 문자열을 해시 값으로 저장하는 방법을 원하지만 해시를 원래 읽을 때가 아니라 참조 할 때 변수 값을 확인하기 만하면됩니다. 그게 가능한가, 아니면 비슷한 것이 가능한가? – kerrai
방금 작성했습니다. 설명과 같이 중첩 해시 객체를 만들고 myhash.fetch (@api) .fetch (@call_type) .fetch ('url')'및 'rescue KeyError'를 사용하여 값을 검색하십시오. Btw. 자신이하는 일을 정확히 알지 않으면 전역 변수를 피하십시오. –