Ruby遍历Departure模型并为符合条件实例分配住宿日期
修正你的Ruby类并实现需求
先看你代码里的几个明显问题:
- Departure的构造函数完全没按需求来,既没接收date、price参数,还错误定义了
@departure数组;而且你需要修改accommodation_start和accommodation_end,所以这两个属性不能只加attr_reader,得用attr_accessor。 - Accommodation的构造函数里把
@name赋值成了first,这是笔误,应该是传入的name参数。 - 要实现Departure关联多个Accommodation,得给Departure加个实例变量来存储关联的住宿实例。
下面是修正后的完整代码,同时实现了遍历Departure实例、给符合日期条件的实例分配住宿起止日期的逻辑:
require 'date' class Departure # 允许读取所有属性,同时允许修改住宿起止日期 attr_reader :date, :price, :accommodations attr_accessor :accommodation_start, :accommodation_end def initialize(date, price) # 把传入的日期字符串/对象转成Date类型,方便比较 @date = Date.parse(date.to_s) @price = price @accommodations = [] # 存储关联的Accommodation实例 @accommodation_start = nil @accommodation_end = nil end # 新增方法:添加关联的住宿 def add_accommodation(accommodation) @accommodations << accommodation if accommodation.is_a?(Accommodation) end end class Accommodation attr_reader :name, :price, :location def initialize(name, price, location) @name = name # 修正笔误 @price = price @location = location end end # 示例用法:创建几个Departure和Accommodation实例 dep1 = Departure.new('2000-06-30', 1000) dep2 = Departure.new('2000-07-02', 1200) dep3 = Departure.new('2024-05-10', 1500) acc1 = Accommodation.new('海边酒店', 300, '三亚') acc2 = Accommodation.new('山景民宿', 250, '大理') # 给departure关联住宿 dep2.add_accommodation(acc1) dep3.add_accommodation(acc2) # 定义目标日期 target_date = Date.new(2000, 7, 1) # 遍历所有Departure实例(这里假设存在一个存储所有实例的数组) all_departures = [dep1, dep2, dep3] all_departures.each do |departure| if departure.date > target_date # 这里可以根据需求设置具体的起止日期,示例用出发日期后3天和后7天 departure.accommodation_start = departure.date + 3 departure.accommodation_end = departure.date + 7 puts "已为出发日期#{departure.date}的行程分配住宿日期:#{departure.accommodation_start} 至 #{departure.accommodation_end}" end end
说明:
- 引入了
date库来处理日期解析和比较,确保日期操作的准确性。 - Departure类新增了
add_accommodation方法来关联多个Accommodation,符合"Departure关联多个Accommodation"的需求。 - 遍历的时候需要把所有Departure实例存到一个数组里(比如示例里的
all_departures),这样才能统一处理。 - 住宿起止日期的赋值逻辑可以根据你的实际需求调整,示例里只是简单设置为出发日期后3天到7天。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

