很抱歉,可能真的是个新手问题:
我想定义一个返回布尔值的getter。f.i.:
attr_reader :server_error?但是,我该如何更新它,因为如果末尾有一个问号,Ruby (1.9)就会抛出语法错误:
#unexpected '='
@server_error? = true
self.server_error? = true发布于 2010-10-25 19:12:00
我建议您定义自己的方法,而不是使用: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发布于 2013-11-05 18:03:46
这个问题很老了,但是使用alias_method你可以做到:
class Foo
attr_reader :server_error
alias_method :server_error?, :server_error
# [...]
end基本上,方法server_error?将是server_error方法的别名。
发布于 2015-08-15 07:25:12
如果需要重复定义此类方法,请定义一个名为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抛出异常。
https://stackoverflow.com/questions/4013591
复制相似问题