在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
是一个散列数组(在这种情况下,它被错误命名)?