return early vs if在Ruby代码中

igsr9ssn  于 2023-10-18  发布在  Ruby
关注(0)|答案(3)|浏览(89)

我看到两种写作风格都是一样的:

def find_nest(animal)
  return unless animal.bird?
  GPS.find_nest(animal.do_crazy_stuff)
end

vs

def find_nest(animal)
  if animal.bird?
     GPS.find_nest(animal.do_crazy_stuff)
  end
end

哪一个更正确/更可取/最好的选择?或者这不重要?

cyvaqqii

cyvaqqii1#

根据Ruby风格指南,
当您可以Assert无效数据时,首选保护子句。保护子句是位于函数顶部的条件语句,它会尽快退出。

# bad
def compute_thing(thing)
  if thing[:foo]
    update_with_bar(thing)
    if thing[:foo][:bar]
      partial_compute(thing)
    else
      re_compute(thing)
    end
  end
end

# good
def compute_thing(thing)
  return unless thing[:foo]
  update_with_bar(thing[:foo])
  return re_compute(thing) unless thing[:foo][:bar]
  partial_compute(thing)
end
vjhs03f7

vjhs03f72#

这显然是个人喜好的问题。但我更喜欢早点回来。它不仅使代码“更扁平”,更容易阅读,而且还可以很好地扩展检查的数量。举例来说:

def create_terms_of_service_notification
    return if Rails.env.test?
    return if current_user.accepted_tos?
    # imagine 5 more checks here. 
    # Now imagine them as a mess of nested ifs.

    # create the notification
  end
p3rjfoxz

p3rjfoxz3#

这:}

def find_nest(animal)
  GPS.find_nest(animal.do_crazy_stuff) if animal.bird?
end

相关问题