4

如果我在 Rails 活动模型方法上调用一个方法,如下所示:

class Foo < ActiveRecord::Base

end

Foo.first

我会取回第一个活动记录。我不必实例化该类。

但是如果我创建自己的类并调用一个方法,我会得到一个异常:

class Person < ActiveRecord::Base
  def greeting
    'hello'
  end
end

Person.greeting 

#EXCEPTION: undefined method `greeting' for Person:Class

我怎样才能让这个问题消失?

4

5 回答 5

13

有几种方法。最重要的两个是:实例方法和类实例方法。

Foo.first是一个类实例方法。它适用于类实例(Foo在本例中为 )。如果它在类中存储一些数据,则该数据将在您的程序中全局共享(因为只有一个名为 Foo 的类(或者::Foo,准确地说是 ))。

但是你的greeting方法是实例方法,它需要对象实例。例如,如果您的问候方法将使用 Person 的名称,则它必须是实例方法,以便它能够使用实例数据(名称)。如果它不使用任何特定于实例的状态,并且您确实打算将它作为类实例方法,则使用self“前缀”。

class Person < ActiveRecord::Base
  def self.greeting
    'hello'
  end
end
于 2012-10-25T11:47:39.890 回答
8

尝试类方法:

class Person < ActiveRecord::Base
  def self.greeting
    'hello'
  end
end

或另一种语法:

class Person < ActiveRecord::Base
  class << self
    def greeting
      'hello'
    end
  end
end
于 2012-10-25T11:45:26.073 回答
2
class Person < ActiveRecord::Base
  def Person.greeting
    'hello'
  end
end

也会工作。我喜欢它,因为它的作用非常清楚;但是,当您决定重命名 Person 类时,它将导致错误。

于 2012-10-25T16:24:51.870 回答
1
class Person < ActiveRecord::Base
    def self.greeting
      'hello'
    end
end
于 2012-10-25T11:46:09.763 回答
0

做一个静态方法试试这个:

类 MyModel
    def self.do_something
        提出“这是一种静态方法”
    结尾
结尾

MyModel.do_something # => "这是一个静态方法"
MyModel::do_something # => "这是一个静态方法"

于 2012-10-25T11:51:18.803 回答