Ruby: Boolean attribute naming convention and use
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.
? is convention for methodnames, not variables. You can't use an instance variable named @foo?
, however you could use a variable named @foo
and name the (manually created) getter method foo?
if you wanted to.
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 method
end
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
@foo
end
def foo=(newfoo)
@foo = newfoo
end
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
end
end
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 method
end