2017-01-19 85 views
1

我寫了一個方法來合併日期間隔與另一個日期間隔,如果間隔的開始等於另一個間隔的結束。如何重構此方法?

def merge 
    slots.each do |slot| 
    if self.start == slot.end 
     slot.end = self.end 
     slot.save 
     return self 
    elsif self.end == slot.start 
     slot.start = self.start 
     slot.save 
     return self 
    end 
    end 
    self.save 
end 

self是,我想與任何存在的slots陣列中的間隔合併它的時間間隔。 重構此方法的最佳方法是什麼?

我嘗試沒有成功把它弄成這個樣子:

def merge 
    slots.each do |slot| 
    if slot.one_bound == slot.other_bound 
     slot.other_bound = self.other_bound 
     slot.save 
     return self 
    end 
    end 
    self.save 
end 
+0

你能解釋一下這個方法應該做什麼嗎?什麼是'slot'和什麼是'self'? – Stefan

+0

好的,我更新了我的問題。 – Sajjad

+0

推測,'merge'是類Range的一個實例方法。那是對的嗎? 'slots'似乎是一個包含範圍數組的局部變量,如果是這樣,那麼會引發異常,因爲'slots'既沒有傳遞給merge方法,也沒有在merge中定義。如果'self = 1..3'和'slots = [0..1,3..5]'是否要將self的值(並返回相同的值)替換爲'0..5'?如果'self = 1..2'和'slots'是相同的,你是否希望返回'0..2'?當self = 1..2'和'slots = [3..5,5..7]'時,你想要返回什麼? –

回答

0

我認爲這是更具可讀性:

def merge 
    slots.each do |slot| 
    if start_the_same_as_end_for?(slot) 
     slot.end = self.end 
    elsif end_the_same_as_start_for?(slot) 
     slot.start = self.start 
    end 

    slot.save 
    end 
end 

private 

def start_the_same_as_end_for?(slot) 
    self.start == slot.end 
end 

def end_the_same_as_start_for?(slot) 
    self.end == slot.start 
end 
0

您可以使用此gem運營商加入到範圍:

# gem install range_operators 
require 'date' 
require 'range_operators' 

range1 = Date.new(2014, 5, 10) .. Date.new(2014, 8, 10) 
range2 = Date.new(2014, 8, 10) .. Date.new(2014, 8, 20) 
range3 = Date.new(2014, 8, 11) .. Date.new(2014, 8, 20) 

puts range1 + range2 
#=> 2014-05-10..2014-08-20 

作爲獎勵,它也可以工作,如果第二個範圍是正確的r第一個範圍:

puts range1 + range3 
#=> 2014-05-10..2014-08-20 

請注意,Range#返回一個範圍數組。如果這個數組只有一個元素,這意味着範圍已經合併:

result = range1 + range2 
if result.size == 1 then 
    # save result.first 
end