在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"