class Car
def self.class_method
puts "It's a class method"
end
def instance_method
puts "It's an instance method"
end
end
Car.class_method => "It's a class method"
Cat.instance_method => undefined method 'instance_method' for Car:Class
Car.new.instance_method => "It's an instance method"
Car.new.class_method => undefined method 'class_method' for Car:Class
下面是Rails中的一个用例:
class Car < ApplicationRecord
belongs_to :owner
has_many :passengers
def self.get_cars(owner) # This is a class method
Car.includes(:passengers).where(owner: owner).order(created_at: :desc)
end
end
2条答案
按热度按时间vxf3dgd41#
在一个对象上定义一个singleton方法会给你一个带有一些新属性的对象。就是这样,不多也不少。
当然,你也可以用另一种方法来实现同样的目的--创建一个具有所需属性的新类,并将其示例化,然后在一个模块中添加必要的行为。
但是考虑一下测试,比如你需要模拟某个对象的方法(当然,RSpec框架提供了更好的方法来完成这件事,但是仍然如此)。或者你在REPL中调试代码,并且想模拟某个方法(比如,为了避免不必要的副作用)。在这种情况下,定义一个单例方法是完成事情最简单(最快)的方法。
只是不要把这个“特性”看作是一个单独的特性。因为它不是。它只是Ruby对象模型工作方式的一个结果--关注后者。我强烈推荐this book...
c0vxltue2#
类方法是在类本身上调用的,这就是为什么在方法声明中,它总是声明def
self.class_method_name.
而示例方法是在类的特定示例(而不是类本身)上调用的,并且它们像常规方法一样声明,即
def instance_method_name.
例如:
下面是Rails中的一个用例:
使用
Car.get_cars(owner)
方法,您可以用自己的逻辑得到所有的汽车。