0

我有一个数组:@costumer_request = ['regular', '12/03/2013', '14/03/2013']。我需要验证第一项是“常规”还是“奖励”,然后验证数组其余部分的每个日期是否是周末。我做了这样的事情:

@costumer_request.each_with_index do |item, index|
  if index[0] == 'regular:'
    if DateTime.parse(index).to_date.saturday? or  DateTime.parse(index).to_date.sunday?
      print "It's a weekend"
    else
      print "It's not a weekend"
    end
  end
end

require 'date'

module HotelReservation

  class Hotel

    HOTELS = {
      :RIDGEWOOD   => 'RidgeWood',
      :LAKEWOOD    => 'LakeWood',
      :BRIDGEWOOD  => 'BridgeWood'
    }

    def weekend?(date)
      datetime = DateTime.parse(date)
      datetime.saturday? || datetime.sunday?
    end

    def find_the_cheapest_hotel(text_file)

      @weekends_for_regular = 0
      @weekdays_for_regular = 0

      @weekends_for_rewards = 0
      @weekdays_for_rewards = 0

      File.open(text_file).each_line do |line|

       @costumer_request = line.delete!(':').split
       @costumer_request = line.delete!(',').split

       #Here I want to process something in each array
       #but if I do something like bellow, it will
       #store the result of the two arrays in the same variable
       #I want to store the result of the first array, process something
       #and then do another thing with the second one, and so on.

       if(@costumer_request.first == 'regular')
         @costumer_request[1..-1].each do |date|
           if (weekend?(date))
            @weekends_for_regular +=1
           else
            @weekdays_for_regular +=1
           end
        end
        else
          if(@costumer_request.first == 'rewards')
            @costumer_request[1..-1].each do |date|
            if (weekend?(date))
              @weekends_for_rewards +=1
            else
              @weekdays_for_rewards +=1
            end
          end
        end
      end
    end
  end
end
end

find_the_cheapest_hotel 方法应该根据给定的数据输出最便宜的酒店。

4

5 回答 5

1
require 'time'
require 'date'
@costumer_request = ['regular', '28/03/2013', '14/03/2013']
if @costumer_request.first == 'regular'
    if @costumer_request[1...-1].all?{|item| Time.local(item).saturday? || Time.local(item).sunday? }
        print "It's a weekend"
    else
        print "It's not a weekend"
    end
end

输出:

It's a weekend
于 2013-04-28T18:24:20.007 回答
0
require 'time'

def weekend?(date)
  datetime = DateTime.parse(date)
  datetime.saturday? || datetime.sunday?
end

@costumer_request = ['regular', '28/03/2013', '14/03/2013']

type = @costumer_request.shift

if type == 'regular'
  @costumer_request.each do |date|
     if weekend?(date)
       puts "#{date} a weekend"
     else
       puts "#{date} not a weekend"
     end
   end
end
于 2013-04-28T18:28:14.080 回答
0

您也可以weekend?直接添加到 DateTime:

class DateTime
  def weekend?
    saturday? || sunday?
  end
end

现在您可以将除第一个元素之外的所有元素转换为 DateTime 对象,然后检查它们是否都在周末。

if @customer_request.first == 'regular'
  dates = @customer_request[1..-1].map { |date_string| DateTime.parse(date_string) }
  if dates.all?(&:weekend?)
    puts 'all dates on a weekend'
  else
    puts 'at least one date is not on a weekend'
  end
else
  puts 'not a regular customer request'
end
于 2013-04-28T18:28:46.233 回答
0

这是一种非常干净的方法:

def is_weekend?(dt)
  dt.saturday? || dt.sunday?
end

type, *dates = @costumer_request

if(type == 'regular')
  dates.each do |date|
    if(weekend?(Date.parse(date))
      #do processing here
    end
  end
end
于 2013-04-28T18:33:53.837 回答
-1
@customer_request = ['regular', '12/03/2013', '14/03/2013']



def val
  @customer_request.first == 'regular' &&
    @customer_request.drop(1).inject(true)  do |m, e|
      wd = Time.local(*e.split('/').reverse.map(&:to_i))
      m &&= (wd.saturday? || wd.sunday?)
    end
end


p val
p val ? 'all are weekends' : 'something isn\'t a weekend'
于 2013-04-28T18:34:27.240 回答