Ruby-访问过程生成的对象

时间:2019-03-13 13:01:10

标签: ruby

tldr:我在启动时生成了多个相似的对象,并且希望能够查看,编辑或以其他方式操作每个对象。 您将如何做

我正在编写的程序记录了车辆的详细信息(制造商,型号,颜色,描述,制造日期和注册号)。以前,我是生成对象并将数据转储到全局变量中的,然后用于搜索,编辑和保存。

我现在正在尝试取消此变量,并直接与对象进行交互。

我看到的所有教程似乎在初始化对象时都依赖于硬编码变量。例如

class Paragraph

attr_accessor :font, :size, :weight, :justification

end

p = Paragraph.new
p.font = 'Times'
p.size = 14
p.weight = 300
p.justification = 'right'

puts "#{p.font}, #{p.size}, #{p.weight}, #{p.justification}"
# => Times, 14, 300, right

因此您可以只使用p.whatever来调用每个字段。 在我的脚本中,我无法对此进行硬编码,因为我不知道将要创建多少个对象。这是我的脚本的开始,该脚本从json加载以前的记录并重新创建对象。

require 'json'

class Car
 attr_accessor :vrm
 attr_accessor :make
 attr_accessor :model
 attr_accessor :description
 attr_accessor :colour
 attr_accessor :date

def initialize(aMake, aModel, aDescription, aColour, aVRM, aManufactureDate)
  @vrm = aVRM
  @make = aMake
  @model = aModel
  @description = aDescription
  @colour = aColour
  @date = aManufactureDate
end

def text_format
  return "Vehicle details: Reg number #{@vrm}, Make #{@make}, Model #{@model}, Description #{@description}, Colour: #{@colour},  Date #{@date}"
end
end

def open_file
 if File.file?("vehicles.json")
   File.open('vehicles.json') do |f|
   $all_vehicles = JSON.parse(f.read)
 end
 $all_vehicles.each do |a_vehicle|
   Car.new(a_vehicle[1][0], a_vehicle[1][1], a_vehicle[1][3], a_vehicle[1][2], a_vehicle[0], a_vehicle[1][4])
  end
   count
   p $vehicle_id
 else
   p 'Unable to find file, creating blank file'
   save_to_file
 end
end

我可以在创建数组时捕获对象ID,但是看不到如何使用该ID来调用对象。

$all_vehicles.each do |a_vehicle|
  file << Car.new(a_vehicle[1][0], a_vehicle[1][1], a_vehicle[1][3], a_vehicle[1][2], a_vehicle[0], a_vehicle[1][4])
  $vehicle_id << file.object_id
end

我想做这样的事情

def search
list_vehicles = all Car objects

list_vehicles.each do |vehicle|
compare vehicle with search criteria

end
end

1 个答案:

答案 0 :(得分:0)

您可以使用Hash代替Array来存储实例,并使用vrm作为密钥:

# initialize the hash
cars_by_vrm = {}

# when creating the instances
$all_vehicles.each do |a_vehicle|
  car = Car.new(a_vehicle[1][0], a_vehicle[1][1], a_vehicle[1][3], a_vehicle[1][2], a_vehicle[0], a_vehicle[1][4])
  cars_by_vrm[car.vrm] = car
end

# when you want to load a specific car later on
car = cars_by_vrm['some_vrm']

请注意将cars_by_vrm替换为对您的应用程序有意义的变量类型或方法。