>  Q&A  >  본문

Ruby的class中定义以self.开头的方法有何不同

比如这个代码

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

高洛峰高洛峰2712일 전614

모든 응답(3)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-22 09:01:47

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

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

    과 같습니다. 으아악

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-22 09:01:47

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

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

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

    으아악

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

    으아악

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

    으아악

    Ruby 클래스도 객체이며

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

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

    으아악

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

    으아악

    로 대체 가능 으아악

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

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

    회신하다
    0
  • 迷茫

    迷茫2017-04-22 09:01:47

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

    클래스 메소드 정의도

    으아악

    회신하다
    0
  • 취소회신하다