Search code examples
rubyattributesconventionsboolean-expression

Ruby: Boolean attribute naming convention and use


Learning ruby. I'm under the impression that boolean attributes should be named as follows:

my_boolean_attribute?

However, I get syntax errors when attempting to do the following:

class MyClass
  attr_accessor :my_boolean_attribute?

  def initialize
    :my_boolean_attribute? = false
  end
end

Apparently ruby is hating the "?". Is this the convention? What am I doing wrong?


Solution

  • 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:

    1. Ruby enforces certain naming conventions. Symbols in Ruby can't have question marks. Thus invocations of :my_boolean_attribute? both will fail with a NameError. Edit: not correct, just use the quoted syntax for a symbol, e.g., :"my_attribute?"
    2. Symbols are immutable, attempting to assign to one will throw a SyntaxError.