在没有实例化类的情况下调用ruby方法

时间:2012-10-25 11:43:43

标签: ruby-on-rails ruby instance-methods class-method

如果我在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

如何解决这个问题呢?

5 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:8)

尝试类方法:

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

或另一种语法:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

要做静态方法,请尝试:

class MyModel
    def self.do_something
        puts "this is a static method"
    end
end

MyModel.do_something  # => "this is a static method"
MyModel::do_something # => "this is a static method"