Ruby的class中定义以self.开头的方法有何不同
高洛峰
高洛峰 2017-04-22 08:59:47
0
3
663

比如这个代码

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方法呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
洪涛

self은 현재 클래스를 가리키므로 이 정의 메서드는 클래스 메서드를 정의합니다. self.을 추가하지 않으면 인스턴스 메서드가 정의됩니다.

이러한 작성 방법 self.은 귀하의 예에서

과 같습니다. 으아악
Peter_Zhu

루비 객체가 호출할 수 있는 메소드에는 두 가지 유형이 있습니다.

과 같이 인스턴스 메서드라고 하는 한 가지 유형이 객체의 클래스에 정의되어 있습니다. 으아악

그러면 Category 인스턴스는 이 메서드를 호출할 수 있지만 Category 자체는 호출할 수 없습니다.

으아악

또 다른 유형은 싱글턴 메서드라고 하는데, 이는 해당 개체의 클래스나 해당 개체와 동일한 클래스에 속하는 다른 개체가 아닌 하나의 개체에서만 호출할 수 있습니다. 싱글턴 방식은 다음과 같이 정의됩니다

으아악

이 정의 이후에는 Category1 객체만 last_updated_at 메소드를 호출할 수 있습니다

으아악

Ruby 클래스도 객체이며

와 같은 자체 싱글톤 메서드를 정의할 수도 있습니다. 으아악

이런 방식으로 Category만 last_updated_at 메서드를 호출할 수 있지만 해당 인스턴스나 다른 클래스, 다른 객체는 호출할 수 없습니다.

으아악

Category 클래스의 정의 내(메서드 외부)에서 self는 Category 자체를 참조하므로

으아악

로 대체 가능 으아악

귀하의 질문에 정의된 방법입니다. 이제 이해가 되셨나요? 본질적으로 Category의 싱글턴 메서드이고 Category는 클래스입니다. 클래스의 싱글턴 메서드는 클래스의 클래스 메서드라고도 하며 클래스 자체에서만 호출할 수 있습니다.

클래스 메소드는 싱글톤 메소드이지만, 그 외에는 특별한 것이 없다는 점에 유의해야 합니다. 인스턴스 메소드가 객체가 속한 클래스에 의해 유지되는 것처럼, 싱글톤 메소드도 객체의 고유 클래스에 의해 유지됩니다. 고유클래스에 대해서는 더 많은 지식이 있으므로 여기서는 언급하지 않겠습니다. 기사에서 이에 대해 이야기하겠습니다.

迷茫

클래스 메서드를 정의하려면 self를 추가하세요. 그렇지 않으면 인스턴스 메서드가 됩니다

클래스 메소드 정의도

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿