Attr_reader с вопросительным знаком в имени
Извините за этот, наверное, действительно новый вопрос:
Я хочу определить getter, который возвращает значение bool. f.i:.
attr_reader :server_error?
Но тогда, как мне его обновить, поскольку Ruby (1.9) выдает синтаксическую ошибку, если в конце есть знак вопроса:
#unexpected '='
@server_error? = true
self.server_error? = true
Ответы
Ответ 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, поскольку !!
является нарушением