attr_reader名称中带有问号

时间:2010-10-25 10:14:23

标签: ruby

对不起,这可能是一个非常新手的问题:

我想定义一个返回bool值的getter。 f.i:

  attr_reader :server_error?

但是,我如何更新它,因为如果最后有一个问号,Ruby(1.9)会抛出语法错误:

#unexpected '='
@server_error? = true
self.server_error? = true

6 个答案:

答案 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