39

これを行うのは常識とRubyの慣習だと思いますが、私はこの方法を持っています:

def is_subscribed?(feed_url)
  Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end

私が得ている唯一の混乱は、メソッド名の最後に疑問符を付けることで最初に予想したように、これがブール値を返さないことです。オブジェクトを条件付きとして評価すると、trueif notが返されるという印象を受けましたnil

どうやら私はここでポイントを逃しており、思ったように評価していません。

それで、私の質問は、ただ行うのが最善でしょうif (condition) true else falseか? または、これを行うためのよりエレガントな方法はありますか?

4

6 に答える 6

44

? で終わるメソッド 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
于 2012-05-10T05:30:53.263 に答える
22

メソッド名の末尾にaを追加し?ても、メソッドの戻り値は変更されませんが、代わりに、それが述語メソッドであることを示すだけです。つまり、メソッドの戻り値はブール値として扱われる必要がありますが、厳密にブール値(つまりtruefalse)である必要はありません。

他の回答の多くは、真実または偽の値を返す必要があると述べています。すべてが真実または偽である可能性があり、Rubyのすべてのメソッドが(例外を発生させない限り)何かを返すため、これはかなり冗長です。戻り値は常に真実または偽です。

他の言語で追加するよりも優れた?代替手段として、を追加することを考えてください。is_たとえば、私はまたはのいずれかを持っているでしょsubscribed?is_subscribed

于 2012-05-10T05:46:14.017 に答える
5

true述語で安全に使用できる「真実」または「偽」の値である必要がありますが、リテラルまたはを返す必要はありませんfalseFile.size?標準ライブラリには、 のようなメソッドもあります。

于 2012-05-10T05:31:06.147 に答える
2

具体的に言うと、疑問符で終わるメソッドは、trueまたはとしてテストできる値を返す必要がありますfalse

「?」からブール値以外の値を返す多くのメソッドが Rails にあります。メソッド。

実際、最近、rails プロジェクトに提出されたプル リクエストがあり、まさにこの問題に注意が向けられていました。

https://github.com/rails/rails/pull/5582

基本的に、議論はまさにこの問題に関するものでした。メソッドは、次のように true または false としてテストできる値を返すだけで済みます。

if (condition)
  # do 'truthy option
else
  # do non-truthy option
end

その観点から、あなたの方法は良いと思います。

于 2012-05-10T05:31:22.413 に答える