attr_reader с вопросительным знаком в имени - PullRequest
28 голосов
/ 25 октября 2010

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

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

  attr_reader :server_error?

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

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

Ответы [ 6 ]

36 голосов
/ 05 ноября 2013

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

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

  # [...]
end

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

10 голосов
/ 25 октября 2010

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

def server_error?
  !!@server_error # Or any other idiom that you generally use for checking boolean
end

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

def server_error?; !!@server_error; end
5 голосов
/ 15 августа 2015

Если вам необходимо повторно определять такие методы, определите модуль с именем 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

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

1 голос
/ 26 октября 2010

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

Class SampleClass
  my_boolean_reader :server_error

  def initialize
    @server_error = false
  end
end

sample_object = SampleClass.new
sample_object.server_error? # => false
0 голосов
/ 31 декабря 2018

Если вы используете Rails или ActiveSupport, вы можете сделать это так:

private

def server_error?
   @server_error.present?
end
0 голосов
/ 10 января 2017
def server_error?
  !@server_error.nil?
end

В соответствии с рекомендациями Рубокоп , поскольку !! является нарушением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...