一个方法应该结束吗?(问号)只返回一个布尔值?

Ken*_*n W 34 ruby

我认为这只是常识和Ruby惯例,但我有这个方法:

def is_subscribed?(feed_url)
  Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end
Run Code Online (Sandbox Code Playgroud)

我得到的唯一困惑是,这不会像我最初预期的那样返回布尔值,方法名称的末尾加上问号.我的印象是,在将对象评估为条件时,true如果不是则返回nil.

显然我在这里忽略了这一点,并没有像我想的那样评估它.

所以,我的问题是,最好只做一个if (condition) true else false?或者有更优雅的方法吗?

Ben*_*ate 39

一个以?结尾的方法 应返回一个可以评估为true或false的值.如果要确保布尔返回,可以通过向查找器添加双重爆炸来实现.

def is_subscribed?(feed_url)
  !!Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,也许该方法应该被命名为"订阅?"."?" 已经传达了"是"的意义. (6认同)
  • "可以评估为真或假的值",但Ruby中的任何值都会评估为"true"或"false"...... (3认同)
  • 除nil和false外,ruby中的所有内容均评估为true (2认同)

And*_*all 17

将a添加?到方法名称的末尾不会以任何方式更改方法的返回值,而只是表示它是谓词方法.也就是说,该方法的返回值应该被视为布尔值,但不一定是严格的布尔值(即truefalse).

许多其他答案表明它应该返回一个真实或虚假的值.这是多余的,因为一切都可以是真或假,并且因为Ruby中的所有方法都返回一些东西(除非它们引发异常),返回值总是真或假.

想想在其他语言中?添加一个更好的替代方案is_; 例如,我要么subscribed?is_subscribed.


x1a*_*1a4 5

它应该是'truthy'或'falsy'值,可以在谓词中安全使用,但不必返回文字truefalse.File.size?在标准库中甚至有像这样的方法.