Ruby:嵌套if语句

rlh*_*lhh 4 ruby nested-if

我正在写一些代码,结果却让我觉得太难看了.反正我是否可以重构它以便我不使用嵌套的if语句?

def hours_occupied(date)
  #assuming date is a valid date object    
  availability = get_work_hours(date)
  focus = "work"

  if availability.nil
    availability = get_family_hours(date)
    focus = "family"

    if availability.nil
      availability = get_friend_hours(date)
      focus = "friends"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我知道我可以做这样的事情以获得可用性

availability = get_work_hours(date) || get_family_hours(date) || get_friend_hours(date)
Run Code Online (Sandbox Code Playgroud)

但是如何相应地设置焦点变量?

Don*_*ank 5

我会做类似下面的事情,因为它清楚地表明每个案例是互斥的:

def hours_occupied(date)
  if availability = get_work_hours(date)
    focus = "work"
  elsif availability = get_family_hours(date)
    focus = "family"
  elsif availability = get_friend_hours(date)
    focus = "friends"
  end
end
Run Code Online (Sandbox Code Playgroud)

  • Ruby条件是表达式,所以不需要重复"焦点"3次 (2认同)

tru*_*ich 2

另一种方法是在需要时重新分配值:

def hours_occupied(date)
  availability, focus = get_work_hours(date), "work"
  availability, focus = get_family_hours(date), "family" unless availability
  availability, focus = get_friend_hours(date), "friend" unless availability
end
Run Code Online (Sandbox Code Playgroud)

或使用迭代器:

def hours_occupied(date)
  availability = focus = nil
  %w(work family friend).each {|type| availability, focus = self.send(:"get_#{type}_hours", date), type unless availability}
end
Run Code Online (Sandbox Code Playgroud)