Ruby 一个方法是否应该结束于?(问号)是否仅返回布尔值?
我认为这只是常识和Ruby惯例,但我有以下方法:Ruby 一个方法是否应该结束于?(问号)是否仅返回布尔值?,ruby,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 唯一让我感到困惑的是,它并没有像我最初预期的那样返回布尔值,而是在方法名的末尾打上问号。我的印象是,当作为条件计算对象时,如果不是nil,它将返回true 很明显,我没有抓住重点,也没有像我想的那样进行评
def is_subscribed?(feed_url)
Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end
唯一让我感到困惑的是,它并没有像我最初预期的那样返回布尔值,而是在方法名的末尾打上问号。我的印象是,当作为条件计算对象时,如果不是nil
,它将返回true
很明显,我没有抓住重点,也没有像我想的那样进行评估
所以,我的问题是,如果(条件)为真或为假,最好只做一个
?还是有一种更优雅的方法可以做到这一点?一种以结尾的方法?应返回一个可计算为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
它应该是一个“truthy”或“falsy”值,可以在谓词中安全使用,但不必返回literaltrue
或false
。甚至在标准库中也有类似的方法。事实上,具体来说——以问号结尾的方法应该返回可以测试为true
或false
的值
rails中有许多方法从“?”方法返回非布尔值
事实上,最近有一个提交给rails项目的pull请求将注意力集中在了这一问题上:
基本上,讨论围绕着这个确切的问题——方法只需要返回可以测试为真或假的值,如下所示:
if (condition)
# do 'truthy option
else
# do non-truthy option
end
从这个角度来看,我相信您的方法很好。在方法名称的末尾添加一个?
不会以任何方式更改方法的返回值,而只是表明它是一个谓词方法。也就是说,方法的返回值应被视为布尔值,但不需要严格为布尔值(即true
或false
)
许多其他答案都指出,它应该返回一个truthy或falsy值。这是相当多余的,因为任何东西都可以是truthy或falsy,而且Ruby中的所有方法都会返回某些东西(除非它们引发异常),因此返回值总是truthy或falsy
考虑在其他语言中添加?
作为一种更好的替代方法,以取代在前面添加is.
;e、 g.我会订阅?
或已订阅
其他答案很好地涵盖了返回值
我要补充的是,现代风格的指南不鼓励将作为布尔方法的前缀。后面的问号覆盖了这个语义糖
发件人:
布尔方法问号
谓词方法(方法)的名称
返回布尔值)应以问号结尾(即。
数组#空?)。不返回布尔值的方法不应以
问号
布尔方法前缀
避免使用
辅助动词,如is、do或can。这些词是多余的
与Ruby内核中的布尔方法风格不一致
图书馆如空?包括
另一种选择是使用三元/条件运算符强制布尔返回
if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this
我同意其他人将您的方法名称更改为
def subscribed?
顺便说一句,也许该方法应该命名为“subscribed?”。“?”已经传达了“是”的含义。“一个可以计算为真或假的值”,但是Ruby中的任何值都会计算为true
或false
…Ruby中的所有值都计算为真,除了nil和false。你是对的。它应该是“返回一个可以有意义地评估为true或false的值”。