`alias_method`是一种私有方法

时间:2015-08-13 08:46:14

标签: ruby alias-method

我有一个暴露两个接口方法client_optionsuser_options的类,在这个祖先级别,它们等同于default_options。我不希望其他开发者直接实施default_options,因此它是私有的。

class Foo
  def client_options
    default_options
  end
  def user_options
    default_options
  end

  private
    def default_options
      { foo: :bar }
    end
end

为了保存一些代码行,我想对方法进行别名:

class Foo
  alias_method :client_options, :default_options
  alias_method :user_options, :default_options

  private
    def default_options
      { foo: :bar }
    end
end

alias_method仅对公共方法进行别名。

我找到了如何在this blog上对私有方法进行别名:

class Foo
  def default_options
    { foo: :bar}
  end

  private :default_options
  alias_method :client_options, :default_options
  public :client_options
end

但是,它有点不可读。

是否有更直接的解决方法来为私有方法设置别名?

3 个答案:

答案 0 :(得分:7)

别名,然后私有化:

%i(client_options user_options).each do |m|
  define_method m { default_options }
end

或者,你是否意识到这种“剪刀规则”:

alias_method

或者创建自己的 module AliasPrivateMethod def alias_private_method_to_interface(name, original_name) define_method(name) do |*args, &block| send(original_name, *args, &block) end end end class Foo extend AliasPrivateMethod alias_private_method_to_interface(:client_options, :default_options) private def default_options { foo: :bar } end end foo = Foo.new foo.public_methods(false) # => [:client_options] foo.client_options # => { foo: :bar } 类似方法

create or replace function addNum(p1 number,p2 number)  return 
as
begin 
 return p1+p2;
end;

BEGIN
  sys.DBMS_HPROF.START_PROFILING('TMP', 'test.trc');
END;
/

declare 
 n number;
 n2 number;
 n3 number;
BEGIN
  select sum(1),max(1),ln(1) into n,n2,n3 from dual;
  select max(addNum(1,level)) into n from dual connect by level<10;
END;
/

BEGIN
  DBMS_HPROF.STOP_PROFILING;
END;
/

答案 1 :(得分:1)

我找到一个好方法的一种方法是将私有方法委托给self

require 'forwardable'
class Foo
  extend Forwardable
  def_delegator :self, :default_options, :client_options
  def_delegator :self, :default_options, :user_options

  private
    def default_options
      { foo: :bar }
    end
end

f = Foo.new
f.client_options 
# => { foo: :bar }

答案 2 :(得分:1)

如何实现要隐藏在前置模块中的方法?

module ProtoFoo
  protected
    def default_options
      {foo: :bar}
    end
end

class Foo
  prepend ProtoFoo
  def client_options; default_options end
  def user_options; default_options end
end

即使用户覆盖default_options中的Foo,也不会生效。

如果你坚持在曝光的东西之后写下隐藏的东西,你可以这样做:

class Foo
  def client_options; default_options end
  def user_options; default_options end
end

module ProtoFoo
  def default_options
    {foo: :bar}
  end
end
Foo.prepend ProtoFoo