Ruby: Boolean attribute naming convention and use
Edit: three-years later; the times, they are a-changin'…
Julik's answer is the simplest and best way to tackle the problem these days:
class Foo attr_accessor :dead alias_method :dead?, :dead # will pick up the reader methodend
My answer to the original question follows, for posterity…
The short version:
You can't use a question mark in the name of an instance variable.
The longer version:
Take, for example, attr_accessor :foo
— it's simply conceptually a bit of syntactic sugar for the following:
def foo @fooenddef foo=(newfoo) @foo = newfooend
Furthermore, the question-mark suffix is mostly just a convention to indicate that the return value of a method is a boolean.
The best approximation I can make of what you're going for here…
class MyClass def initialize @awesome = true end def awesome? @awesome endend
In this case, there may be a case to be made for using attr_accessor
— after all, it may be explicit that you're working directly with a boolean attribute. Generally, I save the question-mark suffix for when I am implementing a method whose boolean return value is based on slightly more complex conditions than just the value of an attribute.
Cheers!
Edit, two years later, after a recent comment:
- Ruby enforces certain naming conventions.
Symbols in Ruby can't have question marks. Thus invocations ofEdit: not correct, just use the quoted syntax for a symbol, e.g.,:my_boolean_attribute?
both will fail with aNameError
.:"my_attribute?"
- Symbols are immutable, attempting to assign to one will throw a
SyntaxError
.
The easiest way to quickly add a "question method" is to use aliasing for your reader method
class Foo attr_accessor :dead alias_method :dead?, :dead # will pick up the reader methodend
The attr_accessor
symbol implies that the variable name is @my_boolean_attribute
, so that's what you should be setting (not the symbol).
Also, you can't use ? for variables, just method names.