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

Bik*_*ire 4 ruby

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

class ABC
  def test
     "test"
  end

  def display_test
    puts test
  end
end
Run Code Online (Sandbox Code Playgroud)

我只希望能够ABC.new.display_test从我的控制台(IRB)打电话(给我'测试')并且无法打电话ABC.new.test或者ABC.new.send(:test)那件事.这可能吗?如果是这样,怎么样?

Sir*_*ius 5

最彻底的方法是使用testprivate 覆盖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
Run Code Online (Sandbox Code Playgroud)

请注意,这个send覆盖不合适,因为它只接受一个参数.

如果以正确的方式完成,就可以做到这样的事情:

ABC.new.send(:send, :test)
Run Code Online (Sandbox Code Playgroud)