我正在寻找在初始化方法中设置相应实例变量的值时创建相应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内置的类和模块中是否存在执行我所描述的方法?
答案 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'