我想要这样的东西:
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
一个私有方法并a.send(:only_B_can_call_me)
在 B 内部使用。好的,它可以工作。但是我可能会被诱惑在 C 中做同样的事情......所以,我认为这不是一个好方法。有没有其他方法可以做到这一点?(允许仅通过特定类的实例访问方法。)
(我知道最终总是可以从任何地方使用 访问任何方法send
。但我想让自己远离send
这种情况。)
没有明确的解决方案。如果 B 可以做到,C 也可以。 与其他一些语言不同,ruby 没有“内部”或“包”可见性修饰符,如果 A 和 B 在同一个“包”中,这可以帮助您,但 C 是外部的. 如果方法是私有的,即使 B 也必须使用send
. 如果它是公开的,C 就可以调用它。B 在您的示例protected
中不是A 的子类,因此修饰符不适用。
一种肮脏的方式是 check caller
in only_B_can_call_me
。它返回整个调用堆栈。所以你可以检查它是否确实是 B 或者拒绝。但这是超级脆弱的,完全不推荐。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句