ruby - 有没有办法让 attr_reader 创建与实例变量名称不同的方法?

标签 ruby attributes conventions standard-library

在 Ruby 中,有没有办法做类似的事情

class Foo
    attr_reader :var_name :reader_name #This won't work, of course
    def initialize
        @var_name = 0
    end
end

# stuff here ....

def my_method
    foo = Foo.new
    assert_equal 0,foo.reader_name
end

换句话说,是否有一种标准方法可以为使用与变量不同名称的变量创建访问器方法。 (当然,除了手工编码。)

最佳答案

你可以使用 alias_method :

class Foo
  attr_reader :var_name
  alias_method :reader_name, :var_name
  def initialize
    @var_name = 0
  end
end

attr_reader 构建的var_name 方法仍然可用。你可以使用 remove_method如果你真的想摆脱 var_name 方法(但要确保你以正确的顺序获得所有内容):

class Foo
  attr_reader :var_name
  alias_method :reader_name, :var_name
  remove_method :var_name
  def initialize
    @var_name = 0
  end
end

如果你真的想要,你可以将 attr_reader_as 方法修补到模块中:

class Module
  def attr_reader_as(attr_name, alias_name)
    attr_reader attr_name
    alias_method alias_name, attr_name
    remove_method attr_name
  end
end

class Foo
  attr_reader_as :var_name, :reader_name
  def initialize
    @var_name = 0
  end
end

更好的 attr_reader_as 会采用散列(例如 { var_name: :reader_name, var_name: :reader_name2}),但我会把它留给读者作为练习.

关于ruby - 有没有办法让 attr_reader 创建与实例变量名称不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772457/

相关文章:

c# - 获取通用的自定义属性

c# - 包装函数的属性?

javascript - 关于记录 JavaScript : JS types 的问题

Pythonic 方式 : Utility functions in class or module

ruby-on-rails - 如何在 Cucumber 中测试不同的环境(例如开发|测试|生产)?

Ruby 2.3.3 接地气的 Rubyist - 25 :Fixnum 的未定义方法 `balance'

ruby - 使用 Ruby 解析和编写 Puppet 节点定义

jquery - 如何根据 src 属性使用 Jquery 检查 DOM 中是否存在图像元素?

msbuild - 删除基于 MSBuild/Convention 的文件名生成中的尾部斜杠

ruby-on-rails - 使用默认键创建新哈希