Подтвердить что ты не робот

Attr_reader с вопросительным знаком в имени

Извините за этот, наверное, действительно новый вопрос:

Я хочу определить getter, который возвращает значение bool. f.i:.

  attr_reader :server_error?

Но тогда, как мне его обновить, поскольку Ruby (1.9) выдает синтаксическую ошибку, если в конце есть знак вопроса:

#unexpected '='
@server_error? = true
self.server_error? = true
4b9b3361

Ответ 1

Я предлагаю определить свой собственный метод, а не использовать :attr_reader

def server_error?
  [email protected]_error # Or any other idiom that you generally use for checking boolean
end

для краткости, вы можете сделать это в одной строке:

def server_error?; [email protected]_error; end

Ответ 2

Этот вопрос старый, но с alias_method вы можете достичь этого:

class Foo
  attr_reader :server_error
  alias_method :server_error?, :server_error

  # [...]
end

В принципе метод server_error? будет алиасом для метода server_error.

Ответ 3

Если вам нужно многократно определять такие методы, определите модуль с именем AttrBoolean:

module AttrBoolean
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def attr_boolean(*names)
      names.each do |name|
        define_method(:"#{name}=") do |value|
          instance_variable_set(:"@#{name}", value)
        end

        define_method(:"#{name}?") do
          !!instance_variable_get(:"@#{name}")
        end
      end
    end
  end
end

Вы можете использовать это следующим образом:

class Foo
  include AttrBoolean

  attr_boolean :server_error, :resolved
end

f = Foo.new
f.server_error = true
f.resolved = false
f.server_error? # => true
f.resolved?     # => false

Обратите внимание, что методы getter без вопросительного знака не определены. Выражение f.server_error вызывает исключение.

Ответ 4

attr_reader является примером того, что "Метапрограммирующее Ruby" вызывает "Class Macro". Если бы вы захотели, вы могли бы определить свой собственный макрос класса, чтобы вы могли сделать

Class SampleClass
  my_boolean_reader :server_error

  def initialize
    @server_error = false
  end
end

sample_object = SampleClass.new
sample_object.server_error? # => false

Ответ 5

def server_error?
  [email protected]_error.nil?
end

Как рекомендовано Rubocop, поскольку !! является нарушением