如何在控制台中调用ruby中的某个方法

假设我有两种方法的ABC类。

class ABC def test "test" end def display_test puts test end end 

我只希望能够从我的控制台(IRB)调用ABC.new.display_test (返回’test’)并且无法调用ABC.new.testABC.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私有方法