Ruby中类定义中方法类的含义是什么?

时间:2011-01-06 05:30:56

标签: ruby-on-rails ruby

我熟悉类定义中的函数定义和变量声明:

public class MyClass {
  public int myvar;
  public void doSomething() {

  }
}

但是当在类定义中实际调用方法时,它在Ruby中的意思是什么?这在Rails中发生了很多,例如:

class User < ActiveRecord::Base
  has_many :posts
end

这到底是做什么的(比“它为课程添加一些方法”更低的水平)?我如何实现这样的功能(例如,混合了一些其他方法的功能)?

2 个答案:

答案 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