【问题标题】:Better way to set default values?设置默认值的更好方法?
【发布时间】:2010-11-05 03:21:04
【问题描述】:

我们能否让下面的 Ruby 代码更短,同时更具可读性?

height = do_some_calc
height = 128 if height == 0

【问题讨论】:

  • 我不同意编辑问题的标题,但我不知道比以前更好的变体(以“如何写得更好/更短?”的风格)。
  • @Nakilon 我同意你的观点,但正如你所说,上一个问题的标题不是很清楚。

标签: ruby code-readability


【解决方案1】:
height = 128 if 0 == height = do_some_calc

这是我知道的唯一方法,如果 do_some_calc 必须只评估一次。

【讨论】:

  • 除了优雅之外的一切都非常棒,+1
  • 而且它不会用辅助变量污染本地命名空间...... :-)(大多数其他解决方案都这样做)
  • 为了提高可读性,我将其重写为height = 128 if (height = do_some_calc) == 0
  • @Max,如果你用 Ruby 编写,那么用 Ruby 编写,而不是 C。
  • 我已经使用 Ruby 很多年了,我花了一点时间来了解应该如何解析 0 == height = do_some_calc。我会为少一点歧义付出两个括号的代价。还有,这和 C 有什么关系?
【解决方案2】:

如果您愿意更改 do_some_calc 以返回 false 或 nil 而不是 0,那么您就在做生意。

height = do_some_calc || 128

如果您无法将 do_some_calc 更改为返回 false 或 nil,而它通常会返回 0,那么您可以包装它,但从长远来看,您不会保存很多字符。除了在很多地方设置默认值的情况。

如果 do_some_calc 返回 0 并且在所有其他情况下 do_some_calc 的输出,则此包装器将返回 false。

def my_do_some_calc
   temp = do_some_calc 
   temp != 0 && temp
end

把它们放在一起给出:

height = my_do_some_calc || 128

【讨论】:

    【解决方案3】:

    更短?不是并且是功能性的。

      height = (h = do_some_calc).zero? ? 128 : h 
    

    如:

    def do_some_calc
      rand 100
    end
    
    10.times do 
      height = (h = do_some_calc).zero? ? 128 : h 
      puts height
    end
    # >> 3
    # >> 95
    # >> 89
    # >> 82
    # >> 31
    # >> 4
    # >> 82
    # >> 99
    # >> 11
    # >> 64
    

    【讨论】:

      【解决方案4】:

      大概是这样的:

      STANDARD_HEIGHT = 128
      def do_some_calc
        height = 0
        #calculate our height...
        height = height == 0 ? STANDARD_HEIGHT : calculated_height
      end
      

      我认为需要为128 提供更多上下文,因此是常量。我还认为do_some_calc 应该隐藏这样一个事实,即如果它等于 0,它真的应该等于我们的DEFAULT_HEIGHT

      编辑:要回答您隐含的问题(我已对此进行了编辑),我们可以通过延长 do_some_calc 来缩短它。

      【讨论】:

        【解决方案5】:

        你可以这样做

        height = do_some_calc.zero? ? 128 : do_some_calc 
        

        【讨论】:

        • 我认为重点是避免重复调用 do_some_calc,这可能会很昂贵。
        • 嗯,那是我的编程偏好。 OP没有具体说明......但我不得不相信这是真的。
        【解决方案6】:

        这在技术上更短,如果不是很可读:

        (height = do_some_call) == 0 and height = 128
        

        我会说保持它的方式,你的方式似乎是最简洁和可读的。

        【讨论】:

          猜你喜欢
          • 2015-06-30
          • 2020-07-28
          • 2016-11-03
          • 2020-11-23
          • 2012-11-10
          • 2018-08-23
          • 2014-04-03
          • 1970-01-01
          • 2013-10-14
          相关资源
          最近更新 更多