【问题标题】:how do I DRY out this ruby if-then statement?我如何干燥这个红宝石 if-then 语句?
【发布时间】:2017-04-29 03:41:46
【问题描述】:

我有以下代码,对于我想要它做的事情来说似乎很冗长:

if @initial_that.present?
  @that = @initial_that
  get_talk_api_response
else
  get_talk_api_response
end

看起来我可以让它变干,但不确定如何。

【问题讨论】:

    标签: ruby-on-rails ruby dry


    【解决方案1】:

    我确定此重构有一个计算机科学名称,但您在两个分支中都调用 get_talk_api_response,因此请将其放在条件之外:

    if @initial_that.present?
      @that = @initial_that
    end
    
    get_talk_api_response
    

    然后根据热门评论让它看起来更像红宝石:

    @that = @initial_that if @initial_that.present?
    get_talk_api_response
    

    【讨论】:

    • 对于 Ruby 来说更惯用的是,您可以将条件替换为 @that = @initial_that if @initial_that.present?
    • 然后把get_talk_api_response放在下面?
    • 是的,当然。
    【解决方案2】:

    由于您使用的是present? 方法,我假设您的代码在Rails 应用程序中,因此您可以简单地使用presence 方法:

    @that = @initial_that.presence || @that
    get_talk_api_response
    

    来自guides

    2.2 存在

    如果存在,存在方法返回其接收者?,否则返回 nil。

    【讨论】:

    • 与 OP 的逻辑不同,这将超越 @that 中当前的任何值。要使用presence,我想你想做@that = @initial_that.presence || @that
    • @moveson 错过了,你是对的,我会编辑答案。
    • 所以我应该使用@that = @initial_that.presence || @that?
    • @mudasobwa 再想一想,也许使用||= 并不合适,因为一旦设置了@that,它就不会关心@initial_that.presence 返回什么。
    • @Angela 是的,我认为那样更好。
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多