比如这个代码
class Category < ActiveRecord::Base
...
def self.last_updated_at
order('updated_at desc').limit(1).pluck(:updated_at).first.to_i
end
...
end
为什么不直接定义last_updated_at
方法呢?
PHP中文网2017-04-22 09:01:47
self
은 현재 클래스를 가리키므로 이 정의 메서드는 클래스 메서드를 정의합니다. self.
을 추가하지 않으면 인스턴스 메서드가 정의됩니다.
이러한 작성 방법 self.
은 귀하의 예에서
天蓬老师2017-04-22 09:01:47
루비 객체가 호출할 수 있는 메소드에는 두 가지 유형이 있습니다.
그러면 Category 인스턴스는 이 메서드를 호출할 수 있지만 Category 자체는 호출할 수 없습니다.
으아악또 다른 유형은 싱글턴 메서드라고 하는데, 이는 해당 개체의 클래스나 해당 개체와 동일한 클래스에 속하는 다른 개체가 아닌 하나의 개체에서만 호출할 수 있습니다. 싱글턴 방식은 다음과 같이 정의됩니다
으아악이 정의 이후에는 Category1 객체만 last_updated_at 메소드를 호출할 수 있습니다
으아악Ruby 클래스도 객체이며
와 같은 자체 싱글톤 메서드를 정의할 수도 있습니다. 으아악이런 방식으로 Category만 last_updated_at 메서드를 호출할 수 있지만 해당 인스턴스나 다른 클래스, 다른 객체는 호출할 수 없습니다.
으아악Category 클래스의 정의 내(메서드 외부)에서 self는 Category 자체를 참조하므로
으아악은
로 대체 가능 으아악귀하의 질문에 정의된 방법입니다. 이제 이해가 되셨나요? 본질적으로 Category의 싱글턴 메서드이고 Category는 클래스입니다. 클래스의 싱글턴 메서드는 클래스의 클래스 메서드라고도 하며 클래스 자체에서만 호출할 수 있습니다.
클래스 메소드는 싱글톤 메소드이지만, 그 외에는 특별한 것이 없다는 점에 유의해야 합니다. 인스턴스 메소드가 객체가 속한 클래스에 의해 유지되는 것처럼, 싱글톤 메소드도 객체의 고유 클래스에 의해 유지됩니다. 고유클래스에 대해서는 더 많은 지식이 있으므로 여기서는 언급하지 않겠습니다. 기사에서 이에 대해 이야기하겠습니다.