【问题标题】:In ruby, is truthiness idiomatic for a method name ending with a question mark?在 ruby​​ 中,对于以问号结尾的方法名称,真实性是惯用的吗?
【发布时间】:2011-05-16 10:25:16
【问题描述】:

带有问号的方法返回真实的东西(例如,一个数字)以表明某事是真实的,或者应该返回 true 本身是否正常?

在 Ruby 标准库或 Rails 中是否有任何真实性的示例?

背景:有人在an answer to a separate question中写了一个String#int?方法,返回一个整数代表真,nil代表假。另一位用户对没有返回布尔值感到惊讶。

【问题讨论】:

  • 你引用的例子没有遵循约定,它应该返回一个实际的布尔值。
  • 嘿,我看到了那个讨论,想知道这个回答是否会导致这个问题。 :-) 好收获@Andrew Grimm
  • @Adam:这不是答案,不是评论吗? (通常我会抱怨人们反其道而行之!)

标签: ruby idioms truthiness


【解决方案1】:

添加 ?在 Ruby 中为方法名称添加一个惯用的方法是该方法将返回 true 或 false。 Object#nil? 就是一个很好的例子。事实上,Object 有很多真实性检查的好例子。

【讨论】:

    【解决方案2】:

    ? 结尾的方法通常返回truefalse,但这不是系统的,没有核心方法会假定它。

    核心类中的一个例子是Numeric#nonzero?,它从不返回truefalse

    42.nonzero? # => 42
    

    Set 也有add?delete?。我希望Enumerable#one? 返回nilfalse 以区分计数为零和大于一的情况。

    一个类似的例子是比较运算符(<>、...),它们通常只返回truefalseModule 的运算符再次存在异常,当两个模块不相关时将返回 nil

    Array > Enumerable  # => false
    Array > Fixnum      # => nil
    

    【讨论】:

    • Heckle 在内部也使用了Ternary logic - IIRC true 表示方法是无问题的,false 意味着它不是,nil 意味着它没有任何问题.
    【解决方案3】:

    您的问题有两个答案,而且都是有效的:

    从技术上讲,在进行条件测试时,任何返回 falsenil 值的值都充当 false 布尔值,就像非 nil 或 true 值充当 true 一样。因此,在您想知道某事物是否为整数的大多数情况下,所讨论的方法都可以正常工作。

    但在风格上是一种以“?”结尾的方法应该返回一个布尔值 truefalse 并且只有那些。

    所讨论的方法并不能很好地满足我们的期望,并且不符合 POLS(“最小意外原则”),因为您可以合理地期望返回一个布尔值,并得到一个整数或零。当代码因意外的nil 或 Fixnum 值而失败时,这可能会导致代码中出现令人不快的意外。

    所以,虽然它是一个有效的方法,但它不是一个好的方法,我会在代码审查中提出它。这导致单独讨论诸如此类微妙的事情如何增强或损害代码维护,但这是一个完全不同的讨论。

    【讨论】:

      【解决方案4】:

      我重命名了相关方法以删除 ?,这对于正在回答的问题实际上并不重要。扫描以 ?s 结尾的核心函数,我发现返回数据或 nil 的唯一函数是 Set 上的 add?delete? 方法。

      【讨论】:

      • 我从您的回答中删除了我的评论:我错了。谢谢你的课!
      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2010-09-13
      • 2021-10-17
      相关资源
      最近更新 更多