在Ruby中,我可以将受保护方法的访问权授予不同的指定类吗?
例如,我想做这样的事情在Ruby中,我可以将受保护方法的访问权授予不同的指定类吗?,ruby,private,Ruby,Private,例如,我想做这样的事情 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.
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")
我只希望父类的实例能够更改子类的@name
编辑
我只希望父类的实例能够更改子实例的@name
。不,您不能这样做。问题不在于方法是私有的。无法通过实例上定义的访问器访问类实例变量。很遗憾,这是不可能的。你能得到的最接近的是:
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\u variable\u set
是一个公共方法,它与eval
一起使得ruby中的私有/公共差异不像其他语言那样严格。使用这些方法时应该非常谨慎,通常会被认为有点“黑客行为”。我想你的意思是将@name
作为一个实例变量,而不是类实例变量……如果我的直觉是正确的,你可以使用\send
:
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"