ruby 为类的示例定义方法

xurqigkl  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(174)

如何在一个类的示例上定义一个方法,并且该方法只用于该示例,而不用于其他示例?
有人能提供此功能的使用案例吗?

vxf3dgd4

vxf3dgd41#

在一个对象上定义一个singleton方法会给你一个带有一些新属性的对象。就是这样,不多也不少。
当然,你也可以用另一种方法来实现同样的目的--创建一个具有所需属性的新类,并将其示例化,然后在一个模块中添加必要的行为。
但是考虑一下测试,比如你需要模拟某个对象的方法(当然,RSpec框架提供了更好的方法来完成这件事,但是仍然如此)。或者你在REPL中调试代码,并且想模拟某个方法(比如,为了避免不必要的副作用)。在这种情况下,定义一个单例方法是完成事情最简单(最快)的方法。
只是不要把这个“特性”看作是一个单独的特性。因为它不是。它只是Ruby对象模型工作方式的一个结果--关注后者。我强烈推荐this book...

c0vxltue

c0vxltue2#

类方法是在类本身上调用的,这就是为什么在方法声明中,它总是声明def self.class_method_name.
而示例方法是在类的特定示例(而不是类本身)上调用的,并且它们像常规方法一样声明,即def instance_method_name.
例如:

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

使用Car.get_cars(owner)方法,您可以用自己的逻辑得到所有的汽车。

相关问题