如何在控制台中调用ruby中的某个方法
假设我有两种方法的ABC类。
class ABC def test "test" end def display_test puts test end end
我只希望能够从我的控制台(IRB)调用ABC.new.display_test
(返回’test’)并且无法调用ABC.new.test
或ABC.new.send(:test)
。 这可能吗? 如果是这样,怎么样?
最彻底的方法是将test
私有并覆盖send
方法以专门阻止对test
的调用:
class ABC def test "test" end private :test def display_test puts test end def send(id) if id == :test raise NoMethodError.new("error") else super(id) end end alias_method :__send__, :send end
请注意,此send
覆盖不合适,因为它只接受单个参数。
如果以正确的方式完成,就可以做到这样的事情:
ABC.new.send(:send, :test)
将您的方法设为私有。
一种方法是:
class Foo private def bar # … end end
另一种方式是:
class Foo def bar # … end private :bar end
请注意,这不会完全阻止该方法被调用:它只会停止“正常”调用。 实际上,有许多方法可以在Ruby中从类外部调用私有方法。 列出一些我的头脑:
Foo.new.send :bar Foo.new.__send__ :bar Foo.new.instance_eval { bar }
您可以尝试枚举每种可能的方式向方法发送消息,但最终您的努力可能会毫无结果:Ruby太开放了,您无法密封大门。 所以坚持让它变得私密。
这部分是可能的。 您可以将其从直接调用中删除,但不能通过发送删除。 这是Ruby私有方法的工作方式。
要防止直接调用它,请将其设为私有。
private :test class TestClass def display_test puts test end private def test "test" end end
这是一个完整的例子:
puts TestClass.new.display_test puts TestClass.new.send(:test) begin puts TestClass.new.test rescue puts "Error!" end
Ruby私有方法