对不起,可能,真的是新手问题:
我想定义一个返回bool值的getter.网络连接:
attr_reader :server_error?
Run Code Online (Sandbox Code Playgroud)
但是,我如何更新它,因为如果最后有一个问号,Ruby(1.9)会抛出语法错误:
#unexpected '='
@server_error? = true
self.server_error? = true
Run Code Online (Sandbox Code Playgroud)
Pig*_*ras 37
这个问题很老,但alias_method你可以实现这个目标:
class Foo
attr_reader :server_error
alias_method :server_error?, :server_error
# [...]
end
Run Code Online (Sandbox Code Playgroud)
基本上该方法server_error?将是该方法的别名server_error.
Swa*_*and 10
我建议定义自己的方法而不是使用 :attr_reader
def server_error?
!!@server_error # Or any other idiom that you generally use for checking boolean
end
Run Code Online (Sandbox Code Playgroud)
为了简洁起见,你可以在一行中做到:
def server_error?; !!@server_error; end
Run Code Online (Sandbox Code Playgroud)
如果需要重复定义此类方法,请定义一个名为的模块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
Run Code Online (Sandbox Code Playgroud)
您可以按以下方式使用它:
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
Run Code Online (Sandbox Code Playgroud)
请注意,没有定义没有问号的吸气方法。该表达式f.server_error引发异常。
| 归档时间: |
|
| 查看次数: |
6874 次 |
| 最近记录: |