Ruby on Rails 3中的类方法 - 我完全迷失了!

时间:2011-03-09 03:18:08

标签: ruby-on-rails ruby

背景here

在上面的链接中,给出了以下示例:

class << self
  def by_author(author)
    where(:author_id => author.id)
  end
end

除了那个语法对我这样的初学者来说很陌生 - 我一直认为类方法是用def self.my_class_method 定义的 - 在哪里可以找到关于Ruby on Rails中类方法的文档?

据我所知,类方法总是在类本身上调用(MyClass.my_class_method),但是如果Rails中的类方法是可链接的,那么似乎必须在这里进行其他操作!

修改

我想通过对类方法的语法做出评论来欺骗我。我真的在问Rails如何使类方法可链接 - 我理解方法链如何工作,但不知道Rails如何允许你链接类方法而不实际返回类在链中的每个“链接”之后对象本身。

3 个答案:

答案 0 :(得分:5)

Ruby中的类方法实际上只是单例类的成员,并且执行class << self涉及直接打开单例类并添加它,从而无需在每个方法定义中声明它。

这个article on Ruby singletons做得很好解释。

对于可链接的类方法,这不是特定于类方法的东西,第二个方法调用只是在从第一个返回的对象上调用。例如:

bar = foo.do_something.do_more

相当于:

tmp = foo.do_something
bar = tmp.do_more

在Rails中,这种可链接性最常用于构建SQL查询(例如,使用whereorder等)。这是因为这些方法中的每一个都返回ActiveRecord Relation

原因

 foo.scoped.my_foo_class_method

作品是因为ActiveRecord::Relation#method_missing执行以下操作:

elsif @klass.respond_to?(method)
  scoping { @klass.send(method, *args, &block) }

检查ActiveRecord类是否响应所调用的方法,如果是,则调用该方法。

答案 1 :(得分:4)

有班级&lt;&lt; self也是定义方法的另一种方法,因此您不必为定义为类方法的每个方法调用“def self.my_method”或“def MyClass.my_method”。而不是打电话

  def self.my_method1
  end

  def self.my_method2
  end
class << self
  def my_method1
  end

  def my_method2
  end
end

干杯!

答案 2 :(得分:2)

以下两位代码是等效的。

使用self.method

class Hello
  def self.world
    puts "Hello, World!"
  end
end

使用class << self

class Hello
  class << self
    def world
      puts "Hello, World!"
    end
  end
end

唯一的区别是可读性,以及重构的简易性。 元编程时经常使用class << self技术。

还有另一个线程可以解释这一点。 class << self vs self.method with Ruby: what's better?