我有一个公开两种接口方法的类client_options和user_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)
但是,它有点难以理解.
是否有更直接的解决方法来为私有方法添加别名?
别名,然后私有化:
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)
| 归档时间: |
|
| 查看次数: |
2609 次 |
| 最近记录: |