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
答案 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
替换为对您的应用程序有意义的变量类型或方法。