我想要这样的东西:
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/