对不起,这可能是一个非常新手的问题:
我想定义一个返回bool值的getter。 f.i:
attr_reader :server_error?
但是,我如何更新它,因为如果最后有一个问号,Ruby(1.9)会抛出语法错误:
#unexpected '='
@server_error? = true
self.server_error? = true
答案 0 :(得分:36)
这个问题已经过时了但alias_method
你可以实现这个目标:
class Foo
attr_reader :server_error
alias_method :server_error?, :server_error
# [...]
end
基本上,方法server_error?
将是server_error
方法的别名。
答案 1 :(得分:10)
我建议您定义自己的方法,而不是使用: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
答案 2 :(得分:5)
如果需要重复定义此类方法,请定义名为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
抛出异常。
答案 3 :(得分:1)
attr_reader
是“Metaprogramming Ruby”称为“类宏”的示例。如果你愿意,你可以定义自己的类宏,这样你就可以做到
Class SampleClass
my_boolean_reader :server_error
def initialize
@server_error = false
end
end
sample_object = SampleClass.new
sample_object.server_error? # => false
答案 4 :(得分:0)
def server_error?
!@server_error.nil?
end
根据Rubocop的建议,因为!!
是违规行为
答案 5 :(得分:0)
如果您使用Rails或ActiveSupport,则可以这样做:
private
def server_error?
@server_error.present?
end