我熟悉类定义中的函数定义和变量声明:
public class MyClass {
public int myvar;
public void doSomething() {
}
}
但是当在类定义中实际调用方法时,它在Ruby中的意思是什么?这在Rails中发生了很多,例如:
class User < ActiveRecord::Base
has_many :posts
end
这到底是做什么的(比“它为课程添加一些方法”更低的水平)?我如何实现这样的功能(例如,混合了一些其他方法的功能)?
答案 0 :(得分:2)
在定义类时,接收者是类对象,因此它与更熟悉的类 。 方法调用类方法的技术。
>> class A
>> def self.hello
>> puts 'world'
>> end
>> hello
>> end
world
=> nil
>> A.hello
world
=> nil
>> class B < A
>> hello
>> end
world
=> nil
因此,为了进一步进行ClassName.new类比,您可以通过这种方式调用任何类方法。我们以new
为例:
>> class C
>> def happy
>> puts 'new year'
>> end
>> new
>> end.happy
new year
=> nil
顺便说一下,不要因为这个方法是在超类中定义的事实而感到困惑。 问: 派生类和超类实例之间有什么区别?说ActiveRecord::Base
? A: 没什么!只有一个类实例。
答案 1 :(得分:1)
ActiveRecord :: Base定义了类方法has_many。 Ruby允许您在定义子类时调用超类类方法。
您可以自己完成此操作,通过制作混合模块,将自己的类方法添加到ActiveRecord :: Base或您自己的类中。
一个如何自己做的简单示例:
module MyMixin
def self.included(base)
base.extend ClassMethods # Load class methods
super
end
module ClassMethods
def hello
puts "MyMixin says => Hello World"
end
end
end
ActiveRecord::Base.send :include, MyMixin
使用示例:
class MyRecord < ActiveRecord::Base
hello
end
启动Rails,你会看到它打印到控制台:
MyMixin says => Hello World