你可以将外部调用重定向到Ruby中的私有方法吗?

时间:2014-09-14 21:25:42

标签: ruby

让我们说例如我有一个带有私有方法栏的Foo类。

class Foo
  private
  def bar
    # private Foo stuff
  end
end

我需要bar方法保持私有和未使用,但我还需要能够调用相同的方法名称并将其行为重定向到类Baz的公共方法栏。

class Baz
  def bar
    # public access bar
  end
end

因此,如果没有触及Foo的私人栏,我可以为任何私有方法调用实现类似method_missing的内容。

class Foo
  def private_methods(meth, *args, &block) # something like method_missing
    if meth.is_private?
      Baz.send meth, *args, &block
    end
  end
end

Foo是一个脾气暴躁的人,不想分享他的酒吧。任何人敲门要求他的酒吧,他都会沿着通往Baz的房子的路向他们开放酒吧。

我希望它能像方法一样缺失。所以我不必定义每一种方法。

2 个答案:

答案 0 :(得分:1)

为什么不按照建议使用method_missing

def method_missing(meth, *args)
  puts "method_missing invoked with meth = #{meth}"
  if(meth==:bar)
    Baz.new.bar
  else
    super
  end
end

然后

Foo.new.bar
#=> method_missing invoked with meth = bar
#=> public bar of Baz
调用

method_missing是因为Foo没有公共方法bar

假设Foo有一个调用bar的方法:

def call_bar
  bar
end

然后,

Foo.new.call_bar
  #=> private bar of Foo

正如所料。

答案 1 :(得分:0)

由于该方法存在,我认为您不能使用方法丢失。你可以做类似下面的事情

class Foo
  def public_bar
    #public bar
    puts "public bar of Foo"
    Baz.new.bar
  end

  private
  def bar
    #private
    puts "private bar of Foo"
  end

  alias_method :private_bar, :bar
  alias_method :bar, :public_bar
end

class Baz
  def bar
    puts "public bar of Baz"
  end
end

因此,当您致电bar时,它会调用public_bar

Foo.new.bar

=> public bar of Foo
=> public bar of Baz

不确定这是否适用于您的方案,但值得一试