ruby - 如何只允许一个类访问另一个类的方法?

标签 ruby

我想要这样的东西:

class A
  def only_B_can_call_me
    'called_by_B'
  end
end

class B
  def do_stuff(a)
    a.only_B_can_call_me
  end
end

class C
  def do_stuff(a)
    a.only_B_can_call_me # how to forbid it?
  end
end

B.new.do_stuff(A.new) # => 'called_by_B'
C.new.do_stuff(A.new) # => it should not be allowed!!! but how to do it?

一种方法是将 only_B_can_call_me 设为私有(private)方法,并在 B 中使用 a.send(:only_B_can_call_me)。好的,它可以工作。但我可能会想在 C 中做同样的事情......所以,我认为这不是一个好方法。还有其他方法吗? (允许方法只能由特定类的实例访问。)

(我知道最终始终可以使用 send 从任何地方访问任何方法。但在这种情况下,我想让自己远离 send。)

最佳答案

没有明确的解决方案。如果 B 可以做到,那么 C 也可以。与其他一些语言不同,ruby 没有“内部”或“包”可见性修饰符,如果 A 和 B 在同一个“包”中,但 C 是外部的,这可以帮助你.如果该方法是私有(private)的,即使 B 也必须使用 send。如果它是公共(public)的,C 就可以调用它。在您的示例中,B 不是 A 的子类,因此 protected 修饰符不适用。

一种肮脏的方法是检查 only_B_can_call_me 中的 caller。它返回整个调用堆栈。所以你可以检查它是否确实是 B 否则拒绝。但这是非常脆弱的,完全不推荐。

关于ruby - 如何只允许一个类访问另一个类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797296/

相关文章:

ruby - 如何只获取没有命名空间的类名

ruby - 这个 define_method 用例是不是太复杂了?

ruby - Gitlab Rack 攻击安装

ruby - Ruby 中的统计和矩阵代数

ruby-on-rails - 哈希 to_json 和返回不保留哈希作为键?

ruby-on-rails - 检查 Ruby 数组的元素是否包含在另一个数组中

自上次检查以来的 Ruby IMAP "changes"

ruby - 使用 Net::HTTP 和 Ruby 1.8.7 更改 ssl 版本

ruby - 二级数组排序,其中一个二级数​​组成员始终在顶部

ruby - 将 jQuery 翻译成 Watir