【问题标题】:Writing better Ruby: How to cast a objects to false or true?编写更好的 Ruby:如何将对象转换为 false 或 true?
【发布时间】:2011-01-18 14:31:35
【问题描述】:

在 ruby​​ 中,返回值的最佳/最优雅的方式是什么,例如:

#method returns true or false if 'do i match' is present in string
def method(str)
  str =~ /do i match/
end

【问题讨论】:

  • 代码有什么问题?它在匹配时返回一个真值,否则返回一个假值。当期待一个布尔值时,无论如何你都不应该使用== true== false
  • 它返回 0 或 nil。我认为它应该返回真或假,非常标准的约定......无处不在?另外,我没有使用 == true,诸如 [statement] if 方法之类的东西?是。似乎比必须记住我编写的 API 是否返回任意值,然后找到它们是什么,然后编写诸如 method?.zero 之类的逻辑要好得多?
  • 但我的意思是,在 ruby​​ 中,除了 nil 和 false 之外的所有内容都是真实的(甚至是 0!甚至是空字符串!)所以,按照您的方法,puts "I work!" if method('do i match') 将打印“我工作!” .不需要.zero?
  • 哦。好点我会考虑的,谢谢(我是 ruby​​ 的 nuby)

标签: ruby code-formatting


【解决方案1】:

可读性和性能之间的折衷

!str.match(/do i match/).nil?

【讨论】:

  • 你能用not替换!吗?
  • 在这个非常特殊的情况下使用'not'是可以的,但是在优先级上存在差异!并不是。试试“puts !true”和“puts not true”。
【解决方案2】:

我可能是异端,但我认为他们隐含的回报是美丽的。在这种情况下,它评估为真或假,但我可以看到人们可能会认为这不清楚。

您可以保留隐式返回并改为:

str =~ /do i match/ ? true : false

【讨论】:

    【解决方案3】:

    有些人会这样做:

    def foo
      !!(str=~/do i match/)
    end
    
    # or
    
    def foo
      match = str=~/do i match/
      !!match
    end
    

    第二个!运行真实性测试并否定答案,然后第一个!再次否定它以获得最初的真实结果。

    我更喜欢更明确的语法:

    def foo
      str =~ /do i match/ ? true : false
    end
    

    这确实是真实的,但对我来说感觉更清楚。做你觉得最干净的事情。

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2021-06-08
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多