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

时间:2013-12-17 16:44:39

标签: ruby

假设我有一个ABC类,有两种方法。

class ABC
  def test
     "test"
  end

  def display_test
    puts test
  end
end

我只希望能够从我的控制台(IRB)拨打ABC.new.display_test(给我'测试')并且无法就此问题致电ABC.new.testABC.new.send(:test)。这可能吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:5)

最彻底的方法是让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)

答案 1 :(得分:2)

将您的方法设为私有。

一种方法是:

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太开放了,你无法密封大门。所以坚持让它变得私密。

答案 2 :(得分:1)

这部分是可能的。您可以将其从直接调用中删除,但不能通过发送删除。这是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 Private Methods