gpt4 book ai didi

ruby - 在实例方法中使用 mixin 方法

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

为什么这不起作用:

class Myclass
include HTTParty

def dosomething
base_uri("some_url")
end


end

base_uri方法是HTTParty的一个类方法。如果我从我的类、任何实例方法之外或从类方法调用它,它工作正常,但是当尝试从实例方法调用它时,我得到“NoMethodError:undefined method `base_uri' for #”

为什么?难道不应该有某种方法从我的实例方法中引用 HTTParty 类,以便我可以调用该 HTTParty 类方法吗?

我可以将其更改为类方法,但这样我的类的每个实例都将具有相同的 base_uri 值。

最佳答案

为什么不起作用?因为那不是 Ruby 的工作方式。同样,这不起作用:

class Foo
def self.utility_method; ...; end
def inst_method
utility_method # Error! This instance has no method named "utility_method"
end
end

您可以通过以下方式解决此问题:

class MyClass
include HTTParty
def dosomething
HTTParty.base_uri("some_url")
end
end

让我们更深入地了解方法查找如何与模块一起工作。首先,一些代码:

module M
def self.m1; end
def m2; end
end

class Foo
include M
end
p Foo.methods - Object.methods #=> []
p Foo.new.methods - Object.methods #=> [:m2]

class Bar
extend M
end
p Bar.methods - Object.methods #=> [:m2]
p Bar.new.methods - Object.methods #=> []

class Jim; end
j = Jim.new
j.extend M
p j.methods - Object.methods #=> [:m2]

如我们所见,您可以使用extend 使对象(类或实例)为对象本身(而不是实例)使用模块的“实例”方法,但是您不能导致模块的“类方法”被任何东西继承。最接近的是这个成语:

module M2
module ClassMethods
def m1; end # Define as an instance method of this sub-module!
end
extend ClassMethods # Make all methods on the submodule also my own
def self.included(k)
k.extend(ClassMethods) # When included in a class, extend that class with
end # my special class methods

def m2; end
end

class Foo
include M2
end
p Foo.methods - Object.methods #=> [:m1]
p Foo.new.methods - Object.methods #=> [:m2]

如果 HTTPParty 模块使用了上述模式,因此使 base_uri 方法在您的 MyClass 上可用,那么您可以这样做:

class MyClass
include HTTParty
def dosomething
self.class.base_uri("some_url")
end
end

...但这比直接引用拥有该方法的模块要多得多。

最后,因为这可能对您有所帮助,所以这是我几年前制作的图表。 (它缺少 Ruby 1.9 中的一些核心对象,例如 BasicObject,但在其他方面仍然适用。单击以获取 PDF 版本。图中的注释 #3 特别适用。)

Ruby Method Lookup Flow
(来源:phrogz.net)

关于ruby - 在实例方法中使用 mixin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569532/

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