true
何かが真であること、またはそれ自体が返されるべきであることを示すために、疑問符の付いたメソッドが真の何か (数値など) を返すのは正常ですか?
たとえば、Ruby 標準ライブラリや Rails で真実性が使用されている例はありますか?
背景:誰かが別の質問への回答に、真を表す整数と偽を表す整数を返すString#int?
メソッドを書きました。別のユーザーは、ブール値を返さないことに驚きました。nil
true
何かが真であること、またはそれ自体が返されるべきであることを示すために、疑問符の付いたメソッドが真の何か (数値など) を返すのは正常ですか?
たとえば、Ruby 標準ライブラリや Rails で真実性が使用されている例はありますか?
背景:誰かが別の質問への回答に、真を表す整数と偽を表す整数を返すString#int?
メソッドを書きました。別のユーザーは、ブール値を返さないことに驚きました。nil
? を追加 Ruby でメソッド名に「?」を付けるのは、メソッドが true または false を返すという慣用句です。オブジェクト#nil? は良い例です。実際、Object には真偽確認の良い例がたくさんあります。
通常、末尾が or のメソッドはor?
を返しますが、これは体系的ではなく、どのコア メソッドもそれを想定していません。true
false
コア クラスの例は、またはNumeric#nonzero?
を返さないものです。true
false
42.nonzero? # => 42
図書館Set
にもadd?
ありdelete?
ます。Enumerable#one?
返されるnil
かfalse
、カウントが 0 の場合と 1 より大きい場合を区別したい。
同様の例は比較演算子 ( <
、>
、 ...) で、通常はtrue
orのみを返しfalse
ます。ここでも、2 つのモジュールが関連していない場合に代わりにModule
返される 's 演算子の例外が存在します。nil
Array > Enumerable # => false
Array > Fixnum # => nil
あなたの質問には2つの答えがあり、どちらも有効です。
技術的には、afalse
またはnil
valueを返すものはすべて、条件付きテストを実行するときにfalseブール値として機能します。これは、nil以外の値またはtrue
valueがtrueとして機能するのと同じです。したがって、問題のメソッドは、何かが整数であるかどうかを知りたいほとんどの場合、正しく機能します。
しかし、スタイル的には「?」で終わるメソッド true
ブール値またはそれらのみを返す必要がfalse
あります。
問題のメソッドは、期待どおりにうまく機能せず、ブール値が返されることを合理的に期待でき、整数またはnilを取得できるため、POLS(「驚き最小の原則」)に失敗します。これは、予期しないnil
値またはFixnum値で失敗した場合に、コードに不快な驚きをもたらす可能性があります。
したがって、これは有効な方法ですが、適切な方法ではありません。コードレビューで取り上げたはずです。そして、それは、そのような微妙なことがコードの保守をどのように強化または害する可能性があるかについての別の議論につながりますが、それはまったく異なる議論です。
問題のメソッドの名前を変更して、を削除しました?
。これは、回答する質問にとって実際には重要ではありませんでした。?sで終わるコア関数をスキャンしたところ、データまたはnilを返したのは、Setのadd?
anddelete?
メソッドだけでした。