12

true何かが真であること、またはそれ自体が返されるべきであることを示すために、疑問符の付いたメソッドが真の何か (数値など) を返すのは正常ですか?

たとえば、Ruby 標準ライブラリや Rails で真実性が使用されている例はありますか?

背景:誰かが別の質問への回答に、真を表す整数と偽を表す整数を返すString#int?メソッドを書きました。別のユーザーは、ブール値を返さないことに驚きました。nil

4

4 に答える 4

8

? を追加 Ruby でメソッド名に「?」を付けるのは、メソッドが true または false を返すという慣用句です。オブジェクト#nil? は良い例です。実際、Object には真偽確認の良い例がたくさんあります。

于 2010-11-27T01:40:09.273 に答える
6

通常、末尾が or のメソッドはor?を返しますが、これは体系的ではなく、どのコア メソッドもそれを想定していません。truefalse

コア クラスの例は、またはNumeric#nonzero?を返さないものです。truefalse

42.nonzero? # => 42

図書館Setにもadd?ありdelete?ます。Enumerable#one?返されるnilfalse、カウントが 0 の場合と 1 より大きい場合を区別したい。

同様の例は比較演算子 ( <>、 ...) で、通常はtrueorのみを返しfalseます。ここでも、2 つのモジュールが関連していない場合に代わりにModule返される 's 演算子の例外が存在します。nil

Array > Enumerable  # => false
Array > Fixnum      # => nil
于 2010-11-28T11:15:58.437 に答える
2

あなたの質問には2つの答えがあり、どちらも有効です。

技術的には、afalseまたはnilvalueを返すものはすべて、条件付きテストを実行するときにfalseブール値として機能します。これは、nil以外の値またはtruevalueがtrueとして機能するのと同じです。したがって、問題のメソッドは、何かが整数であるかどうかを知りたいほとんどの場合、正しく機能します。

しかし、スタイル的には「?」で終わるメソッド trueブール値またはそれらのみを返す必要がfalseあります。

問題のメソッドは、期待どおりにうまく機能せず、ブール値が返されることを合理的に期待でき、整数またはnilを取得できるため、POLS(「驚き最小の原則」)に失敗します。これは、予期しないnil値またはFixnum値で失敗した場合に、コードに不快な驚きをもたらす可能性があります。

したがって、これは有効な方法ですが、適切な方法ではありませんコードレビューで取り上げたはずです。そして、それは、そのような微妙なことがコードの保守をどのように強化または害する可能性があるかについての別の議論につながりますが、それはまったく異なる議論です。

于 2010-11-27T02:53:48.820 に答える
2

問題のメソッドの名前を変更して、を削除しました?。これは、回答する質問にとって実際には重要ではありませんでした。?sで終わるコア関数をスキャンしたところ、データまたはnilを返したのは、Setのadd?anddelete?メソッドだけでした。

于 2010-11-27T03:07:20.887 に答える