例如,我想做类似的事情
class Child
@name = "Bastion, please, call my name!"
attr_reader :name
end
class Parent
@name = "I am a parent"
def rename_child(child,name)
child.name = name
end
end
bastion = Parent.new()
princess = Child.new()
bastion.rename_child(princess,"Moon Child")
我只希望Parent
类的实例能够更改@name
类的Child
。
修改
我只希望Parent
类的实例能够更改@name
实例的Child
。
答案 0 :(得分:1)
我假设你的意思是@name
是一个实例变量,而不是一个类实例...如果我的预感是正确的,你可以使用#send
执行此操作:< / p>
class Child
def initialize
@name = "Bastion, please, call my name!"
end
attr_reader :name
private
attr_writer :name
end
class Parent
def initialize
@name = "I am a parent"
end
def rename_child(child, name)
child.send(:name=, name)
end
end
bastion, princess = Parent.new, Child.new
p princess.name
#=> "Bastion, please, call my name!"
bastion.rename_child(princess, "Moon Child")
p princess.name
#=> "Moon Child"
答案 1 :(得分:0)
不,你不能那样做。问题不在于私有方法。您无法通过实例上定义的访问器访问类实例变量。
答案 2 :(得分:0)
遗憾的是,这是不可能的。你能得到的最接近的是:
class Child
@name = "Bastion, please, call my name!"
attr_reader :name
end
class Parent
@name = "I am a parent"
def rename_child(child,name)
child.instance_variable_set(:@name, name)
end
end
请注意,instance_variable_set
是一种公共方法,它与eval
一起使得ruby中的私有/公共差异不会像其他语言那样严格。这些方法应该非常谨慎地使用,并且通常被认为是稍微“hacky”。