attr_reader名称中带有问号

Ern*_*est 29 ruby

对不起,可能,真的是新手问题:

我想定义一个返回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)


Tsu*_*omu 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
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引发异常。