`alias_method`是一种私有方法

equ*_*nt8 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

  private
    def default_options
      { foo: :bar }
    end
end
Run Code Online (Sandbox Code Playgroud)

alias_method只是别名公共方法.

我在这个博客上找到了如何为私有方法添加别名:

class Foo
  def default_options
    { foo: :bar}
  end

  private :default_options
  alias_method :client_options, :default_options
  public :client_options
end
Run Code Online (Sandbox Code Playgroud)

但是,它有点难以理解.

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

Ale*_*kin 8

别名,然后私有化:

alias_method :client_options, :default_options
alias_method :user_options, :default_options
private :default_options
Run Code Online (Sandbox Code Playgroud)

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

%i(client_options user_options).each do |m|
  define_method m { default_options }
end
Run Code Online (Sandbox Code Playgroud)

或者创建自己的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 }
Run Code Online (Sandbox Code Playgroud)

  • @ equivalent8你最后一个例子也不尊重这个规则. (2认同)