Ruby’s question-mark boolean methods are inconsistent
By convention in Ruby, functions that return true
or false
have a name which ends with a question mark. The grammar of those function names is odd, though. Compare the following:
Array#empty?
Hash#key?(k)
File#exist?(f)
When read out loud, the full sentence sounds different for each:
-
Array#empty?
— array is empty -
Hash#key?(k)
— hash has keyk
-
File#exist?(f)
— filef
does exist
The (unofficial) Ruby style guide suggests exist?
over exists?
(extra s
), but Rails only provides exists?
as method names.
An alternative to key?
is has_key?
, which the (unofficial) Ruby style guide discourages. For consistency with the #exist?
, it’d have to be have_key?
which is not used anywhere, as far as I can tell, probably because it sounds weird.
For grammatical consistency, the methods would better be named as follows:
Array#is_empty?
Hash#has_key?(k)
File#exists?(f)
But in these new forms, there’s not much of a reason left to include a trailing ?
. The meaning of these functions is clear without it. Consider:
-
Array#empty
— used for emptying an array -
Array#is_empty
— used for checking whether an array is empty -
Car#key
— used for keying a car (what kind of example is this, Denis?!) -
Car#keyed
— used for returning a keyed copy of a car -
Car#is_keyed
— used for checking if the car is keyed.
(I don’t own a car, by the way.)