gpt4 book ai didi

ruby - `alias_method` 私有(private)方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:17:10 25 4
gpt4 key购买 nike

我有一个公开两个接口(interface)方法 client_optionsuser_options 的类,在这个祖先级别,它们等同于 default_options。我不希望其他开发人员直接实现 default_options,因此它是私有(private)的。

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 只是公共(public)方法的别名。

我发现了如何在 this blog 上给私有(private)方法起别名:

class Foo
def default_options
{ foo: :bar}
end

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

但是,它有点不可读。

是否有更直接的方法来为私有(private)方法起别名?

最佳答案

化名,然后私有(private)化:

alias_method :client_options, :default_options
alias_method :user_options, :default_options
private :default_options

或者,你是否很清楚这个“剪刀律”:

%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 }

关于ruby - `alias_method` 私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31983479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com