在initialize方法中设置相应实例变量的值时创建attr_reader方法?

时间:2012-03-17 22:50:58

标签: ruby ruby-1.9

我正在寻找在初始化方法中设置相应实例变量的值时创建相应attr_reader方法的方法吗?例如,以下代码:

class SomeClass
  attr_reader :hello
  def initialize( arg)
    @hello = arg
  end
end

我正在寻找写作方式如下:

class SomeClass
  def initialize( arg)
    some_method_as_described_in_question( @hello, arg) 
  end
end   

Ruby内置的类和模块中是否存在执行我所描述的方法?

3 个答案:

答案 0 :(得分:4)

您可以在方法中打开特征类并在那里设置属性:

class SomeClass
  def initialize(arg)
    (class << self; self; end).send(:attr_reader, :hello)
    @hello = arg
  end
end

这样每个实例的本征类都将具有该属性读取器。但是,如果属性名称是动态的,那么只有这样做才有意义,并且可以因实例而异。如果它总是hello,我认为在类中定义它就像原始代码块一样没有任何缺点。

例如,如果您动态传入属性名称,则可以这样做:

class SomeClass
  def initialize(attr, arg)
    (class << self; self; end).send(:attr_reader, attr.to_sym)
    instance_variable_set("@#{attr}", arg)
  end
end

这与Ruby 1.8兼容。从评论中的@HenrikN向您的问题提示,您可以在Ruby 1.9中使用define_singleton_method

class SomeClass
  def initialize(attr, arg)
    define_singleton_method(attr) { instance_variable_get("@#{attr}") }
    instance_variable_set("@#{attr}", arg)
  end
end

答案 1 :(得分:0)

不确定我是否理解了这个问题,但您可以使用Struct来获取初始值设定项和访问者方法:

class SomeClass < Struct.new(:hello)
end

x = SomeClass.new("yo")
puts x.hello  # "yo"
x.hello = "what up"
puts x.hello  # "what up"

答案 2 :(得分:0)

require 'ostruct'

p = OpenStruct.new
p.hello = 'world'
p.could_be_anything = 'nothing'
puts p.hello #=> 'world'
puts p.could_be_anything #=> 'nothing'