gpt4 book ai didi

ruby - 类方法是否有 alias_method ?

转载 作者:行者123 更新时间:2023-12-04 11:13:52 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to alias a class method in rails model?

(5 个回答)


去年关闭。




考虑以下类:

class Foo
def an_inst_method
'instance method'
end

def self.a_class_method
'class method'
end

alias_method :a_new_inst_method, :an_inst_method
end

这没问题,您可以拨打 Foo.new.a_new_inst_method没有问题。

我希望能够拥有类似 Foo.add_widget(*items) 的类方法并将其别名,以便我可以执行以下操作:

Foo.add_widget 'item1'
Foo.add_widgets 'item2', 'item3'

所以本质上它具有“ ruby 风格”,如 1.minute2.minutes所以我想别名 Foo.add_widget这么叫 Foo.add_widgets调用完全相同的方法。我知道我可以包装它,但我觉得我应该能够以更清洁的方式做到这一点。

考虑我尝试这样的事情的尝试:

class Foo
def an_inst_method
'instance method'
end

def self.a_class_method
'class method'
end

alias_method :a_new_inst_method, :an_inst_method
alias_method :a_new_class_method, :a_class_method
end

但是,我收到以下错误:
NameError (undefined method `a_class_method' for class `Foo')

所以看起来这不适用于类方法。我该怎么做?

最佳答案

alias_method给接收者的实例方法取别名。类方法实际上是定义在 singleton class 上的实例方法。一个类(class)。

class MyClass
def self.a
"Hello World!"
end
end

method_1 = MyClass.method(:a).unbind
method_2 = MyClass.singleton_class.instance_method(:a)

method_1 == method_2
#=> true

要别名定义在单例类上的实例方法,您可以使用 class << object 打开它。句法。
class << MyClass
alias_method :b, :a
end

MyClass.b
#=> "Hello World!"

或者您可以直接使用 singleton_class 引用它方法。
MyClass.singleton_class.alias_method :c, :a

MyClass.c
#=> "Hello World!"

如果您仍在类上下文中 self将引用类。所以上面的也可以写成:
class MyClass
class << self
def a
"Hello World!"
end
alias_method :b, :a
end
end

或者
class MyClass
def self.a
"Hello World!"
end
singleton_class.alias_method :c, :a
end

或者两者的结合。

关于ruby - 类方法是否有 alias_method ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61330429/

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