首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >名称中带有问号的attr_reader

名称中带有问号的attr_reader
EN

Stack Overflow用户
提问于 2010-10-25 18:14:23
回答 6查看 8.5K关注 0票数 30

很抱歉,可能真的是个新手问题:

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

代码语言:javascript
复制
  attr_reader :server_error?

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

代码语言:javascript
复制
#unexpected '='
@server_error? = true
self.server_error? = true
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-25 19:12:00

我建议您定义自己的方法,而不是使用:attr_reader

代码语言:javascript
复制
def server_error?
  !!@server_error # Or any other idiom that you generally use for checking boolean
end

为了简洁起见,您可以用一行代码来完成:

代码语言:javascript
复制
def server_error?; !!@server_error; end
票数 11
EN

Stack Overflow用户

发布于 2013-11-05 18:03:46

这个问题很老了,但是使用alias_method你可以做到:

代码语言:javascript
复制
class Foo
  attr_reader :server_error
  alias_method :server_error?, :server_error

  # [...]
end

基本上,方法server_error?将是server_error方法的别名。

票数 39
EN

Stack Overflow用户

发布于 2015-08-15 07:25:12

如果需要重复定义此类方法,请定义一个名为AttrBoolean的模块

代码语言:javascript
复制
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

您可以通过以下方式使用它:

代码语言:javascript
复制
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抛出异常。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4013591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档