在Ruby中将插值赋值给插值变量
我有一个方法:在Ruby中将插值赋值给插值变量,ruby,Ruby,我有一个方法: def create_data_arrays @local_result_hash.each do |job| @jobIds << job["jobId"] @employerNames << job["employerName"] @jobTitles << job["jobTitle"] @minimumSalarys << job["minimumSal
def create_data_arrays
@local_result_hash.each do |job|
@jobIds << job["jobId"]
@employerNames << job["employerName"]
@jobTitles << job["jobTitle"]
@minimumSalarys << job["minimumSalary"]
@maximumSalarys << job["maximumSalary"]
@expirationDates << job["expirationDate"]
@jobDescriptions << job["jobDescription"]
end
end
我想重构该方法,因此创建了以下数组:
@api_parameters = ["jobId", "employerName", "jobTitle", "minimumSalary", "maximumSalary", "expirationDate", "jobDescription"]
并将方法重构为:
def create_data_arrays
@local_result_hash.each do |job|
@api_parameters.each do |parameter|
"@#{parameter}" << job[parameter]
end
end
end
def创建数据数组
@本地_结果_散列。每个do |作业|
@api|U参数。每个do|参数|
“@#{parameter}”查找实例变量\u get
:
def create_data_arrays
@local_result_hash.each do |job|
@api_parameters.each do |parameter|
instance_variable_get("@#{parameter}s") << job[parameter]
end
end
end
def创建数据数组
@本地_结果_散列。每个do |作业|
@api|U参数。每个do|参数|
如我所料,如果@local\u result\u hash
实际上是一个散列数组,那么实例变量\u get(“@#{parameter}s”)将以类似Ruby的方式创建实例变量。我在缩短变量和键的名称以及删除一些键值对方面做了一些自由,但没有改变问题的本质
注意,您不需要初始化实例变量(例如,no@jobIds=[];
@employerNames=[]
等),您不需要数组@api_参数
。如果添加、删除或重命名属性,这将使代码更易于维护
代码
def map_to_instance_vars(local_results)
local_results.first
.keys
.zip(local_results.map(&:values).transpose)
.each { |name,val| instance_variable_set("@#{ name }", val) }
end
h1 = { "jobID"=>123, "title"=>"CEO", "description"=>"The big boss" }
h2 = { "jobID"=>456, "title"=>"Supervisor", "description"=>"Push paper" }
h3 = { "jobID"=>789, "title"=>"Flunkie", "description"=>"Do mindless work" }
local_results = [h1, h2, h3]
map_to_instance_vars(local_results)
@jobID
#=> [123, 456, 789]
@title
#=> ["CEO", "Supervisor", "Flunkie"]
@description
#=> ["The big boss", "Push paper", "Do mindless work"]
示例
def map_to_instance_vars(local_results)
local_results.first
.keys
.zip(local_results.map(&:values).transpose)
.each { |name,val| instance_variable_set("@#{ name }", val) }
end
h1 = { "jobID"=>123, "title"=>"CEO", "description"=>"The big boss" }
h2 = { "jobID"=>456, "title"=>"Supervisor", "description"=>"Push paper" }
h3 = { "jobID"=>789, "title"=>"Flunkie", "description"=>"Do mindless work" }
local_results = [h1, h2, h3]
map_to_instance_vars(local_results)
@jobID
#=> [123, 456, 789]
@title
#=> ["CEO", "Supervisor", "Flunkie"]
@description
#=> ["The big boss", "Push paper", "Do mindless work"]
解释
让local_结果
如上例所示。首先跳到以下论点:
现在创建zip
将发送到的对象:
keys = local_results.first.keys
#=> ["jobID", "title", "description"]
并向其发送带参数的键
:
c = keys.zip(b)
#=> [["jobID", [123, 456, 789]],
# ["title", ["CEO", "Supervisor", "Flunkie"]],
# ["description", ["The big boss", "Push paper", "Do mindless work"]]]
最后,使用为c
的每个元素创建一个实例变量:
c.each { |name,val| instance_variable_set("@#{ name }", val) }
@jobID
#=> [123, 456, 789]
@title
#=> ["CEO", "Supervisor", "Flunkie"]
@description
#=> ["The big boss", "Push paper", "Do mindless work"]
@local\u result\u hash
是一个散列数组(在这种情况下,它被错误命名)?