ruby元编程和关键字自混淆
在阅读ruby中的一些自用代码时,仍然无法理解一些示例:ruby元编程和关键字自混淆,ruby,Ruby,在阅读ruby中的一些自用代码时,仍然无法理解一些示例: class A def hi "hi" end def self.hello "hello" end end a=A.new a.hi A.hello 了解我可以使用以下更改实例方法定义: class << a def hi "hi from a <<" end end a.hi => "hi from a <<" [22]撬杆(主
class A
def hi
"hi"
end
def self.hello
"hello"
end
end
a=A.new
a.hi
A.hello
了解我可以使用以下更改实例方法定义:
class << a
def hi
"hi from a <<"
end
end
a.hi => "hi from a <<"
[22]撬杆(主)>
[23]撬杆(主)>A.f7
NoMethodError:类的未定义方法f7'
from(pry):42:in
pry'
[24]撬杆(主)>a.f7
NoMethodError:未定义的方法f7'#
from(pry):43:in
pry'
[25]撬杆(主)>A.f9
NoMethodError:类的未定义方法f9'
from(pry):44:in
pry'
[26]撬杆(主)>a.f9
NoMethodError:未定义的方法f9'#
from(pry):45:in
pry'
<<ERROR3>>
你能帮我指出这些错误到底是什么吗:参考mark
A.f4
A.f1
A.f5
A.f1
A.f1仍然返回“f1”。我发现,如果使用def,那么该方法被定义并与本征类实例绑定,如果使用define_方法,那么该方法作为静态方法与类A绑定
define_方法和def的用法有什么区别 您在这里提出的问题实际上是关于类、方法和对象如何在Ruby中工作的基础知识 你所做的只是
class
方法和instance
方法之间的区别
实例
方法在最基本的意义上意味着只能从实例化对象的级别调用该方法
这就是您在这里看到的语法
class A
def hi
"hi"
end
end
在这种情况下,方法hi
是类A
的实例方法,因此我们必须实例化一个对象来调用它。为避免混淆外壳a和外壳a,我将使用foo
而不是a
foo = A.new
foo.hi
现在我们刚刚创建了A
的实例
foo,因此我们可以在foo上调用方法hi
接下来我们有class
方法,或者可以在类级别调用的方法。在Ruby中,有多种语法可以实现这一点,以下所有语法在语义上都是等价的
class A
self.hello
"hello"
end
end
class A
A.hello
"hello"
end
end
class A
class << self
def hello
"hello"
end
end
end
现在,如果我们实例化a
b = A.new
b上不存在方法
bar
;它只存在于实例foo
上 通读一遍谢谢你的详细回复。为了扩展我的问题,您知道错误1/2/3的答案吗?在错误1中,您尝试使用语法def self.hello
在实例上定义一个类方法。您只能在实例上定义实例方法,这些方法将传播到特征类;一个与错误1中的相同;您正试图在实例上定义类方法。另一个问题是调用A.f9
。f9被定义为a
实例上的类方法(不允许);因此,即使为实例变量a
正确定义了它,它也将驻留在a
的本征类中,因此它将不可用于类a
错误3与错误2非常相似,我猜我明白你的意思了,我明白了如何通过使用以下方法来访问特征类的实例方法和静态方法:1。元类f9.2。元类.f7。问题是我如何以及何时使用这种技术?达到什么目的?有使用案例吗?
A.f4
A.f1
A.f5
A.f1
class A
def hi
"hi"
end
end
foo = A.new
foo.hi
class A
self.hello
"hello"
end
end
class A
A.hello
"hello"
end
end
class A
class << self
def hello
"hello"
end
end
end
class << foo
def hi
"hi from foo"
end
end
class << foo
def bar
"bar"
end
end
b = A.new