提前道歉我认为可能是一个愚蠢的问题。我保证我已经搜查了,但我不确定我是否已经搜索过正确的内容。我是一个非常新的程序员,Ruby是我的第一个严肃的语言,我在过去的几个月里自学了它。我也从未在StackOverflow上问过一个问题,所以希望这个问题可以接受,并且满足问题询问的其他要求。这是一个问题:
我有一个分支方法,根据传递给方法的值,调用各种不同的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" => ""}
}
}
我遇到的问题是这个分支部分在代码中持续了很长时间 - 部分原因是因为我做得不够理想,我确定。如果分支部分不存在,我也确信我的代码会更有效率。理想情况下,我希望实现这一目标,而不是分支部分:
url = $globalhash[@api][@call_type]["url"]
拉取的值将是特定于呼叫类型的URL和api - 包括的地址,格式和各种其他差异。所以有些价值观会是:
http://api.x.com/@var1_@var2/@variable
http://api.y.com/public/@variable
等等。所以结构各不相同,我需要访问方法调用中存储的实例变量,但我需要动态地这样做。我遇到的问题是,我尝试实现此操作的每一种方式都会导致" url"的字符串中的实例变量的值。当程序开始运行时读取$ globalhash时设置,所有这些都是零。我需要它在发出请求时检查变量,而不是之前,基本上。我有一个类似的(相同的)问题,为请求设置post_data - 如果我能找到一种方法在哈希中设置它,我会有更清晰的代码运行得更快。 post_data如下:
post_data = {'value' => @var1, 'value2' => @var2, 'value3' => @var3}
等等。每个API和每个call_type的post_data都不同;值与它们的请求变量不同。我想在哈希中实现一组看起来模糊的键值对:
$globalhash = {"api_1" => {"call_type_1" => {"url" => "http://api.x.com/#{@variable}", "post_data" => "{'value' => @var1, 'value2' => @var2, etc.}"}}}
当然,它需要工作 - 当读取$ globalhash时,它需要引用的变量为nil。我不确定如何最好地解决这个问题。
该程序按原样运行,但我有一个看起来非常令人沮丧的~80行分支代码,它们会找出URL和post_data的结构,然后请求它。
我考虑过的唯一解决方案是在方法中创建一个实例哈希来替换分支代码,只有在声明实例变量后才会创建。但是,我担心这会给当前的问题带来类似的问题,每次创建一个巨大的新哈希都是低效的。
感谢阅读,感谢您的帮助。我希望伪代码是可以接受的,我发现它是解释我的问题的最佳方式。
编辑:找到解决方案。代码:url = eval "\"#{$globalhash["api_1"]["call_type_1"]["url"]}\""
[" url"]引用' http://api.x.com/# {@ variable}',单引号阻止哈希内插,eval函数将其放在双引号和字符串插值中在调用实例变量时收集它。这是一个丑陋的方法,但它确实让我大大缩短了我的代码。资料来源:https://www.ruby-forum.com/topic/3237101
答案 0 :(得分:0)
而不是使用实例变量创建哈希...
post_data = {'value' => @var1, 'value2' => @var2, 'value3' => @var3}
...您可以使用表示实例变量的字符串初始化哈希值。
post_data = {'value' => '@var1', 'value2' => '@var2', 'value3' => '@var3'}
然后,当您引用哈希变量时,您可以将该调用包装在eval中。
post_data = {'value' => '@var1', 'value2' => '@var2', 'value3' => '@var3'}
@var2 = 'this is test data'
eval(post_data['value2'])
=> "this is test data"
同样地,我会在网址中使用占位符......
url = 'http://api.x.com/[@variable]'
@variable = "cotton_tree"
my_url = url.dup
my_url.sub!(/\[.*?\]/, eval(my_url.match(/\[(.*?)\]/)[1])) while my_url.match(/\[(.*?)\]/)
p my_url
=> "http://api.x.com/cotton_tree"