Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 一个方法是否应该结束于?(问号)是否仅返回布尔值?_Ruby - Fatal编程技术网

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 很明显,我没有抓住重点,也没有像我想的那样进行评

我认为这只是常识和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

很明显,我没有抓住重点,也没有像我想的那样进行评估


所以,我的问题是,如果(条件)为真或为假,最好只做一个
?还是有一种更优雅的方法可以做到这一点?

一种以结尾的方法?应返回一个可计算为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”值,可以在谓词中安全使用,但不必返回literal
true
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的值”。