在Ruby中,我可以将受保护的方法访问给不同的指定类吗?

时间:2014-03-28 23:44:17

标签: 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.rename_child(princess,"Moon Child")

我只希望Parent类的实例能够更改@name类的Child

修改

我只希望Parent类的实例能够更改@name 实例Child

3 个答案:

答案 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”。​​