IT Share you

클래스 본문에 선언 된 Ruby 메서드 호출

shareyou 2020. 12. 12. 12:40
반응형

클래스 본문에 선언 된 Ruby 메서드 호출


방금 레일에서 루비를 배우기 시작했으며 다음과 같은 코드가 발생했습니다.

class Post < ActiveRecord::Base
 validates_presence_of   :title
 belongs_to :user
end

클래스 본문에는 두 가지 메서드 호출이 있습니다. 클래스 본문 내에서 메서드 호출이 작동하는 방식을 설명하는 루비 문서를 찾는 데 어려움을 겪었습니다. 내가 가지고있는 모든 책은 클래스 및 인스턴스 메서드를 정의하는 방법과 다른 메서드 내에서 호출하는 방법 만 설명합니다.

내가 가진 질문은 다음과 같습니다. 이러한 메서드는 언제 어떻게 호출됩니까? 그들은 어떻게 정의됩니까? 일부 활성 레코드 모듈에 믹스 인이 정의되어 있습니까?


클래스 정의의 본문은 다른 코드와 마찬가지로 코드의 실행 컨텍스트입니다. 클래스의 컨텍스트 내에서 실행되는 코드 (즉 self, 클래스의 인스턴스 인 클래스 개체). 로컬 및 인스턴스 변수 (클래스의 인스턴스가 아닌 클래스 개체 자체에 속함)를 가질 수 있으며 클래스 개체가 응답하는 모든 메서드를 호출 할 수 있습니다. 클래스 정의 블록이 완료되면 코드가 실행됩니다.

이 경우 ActiveRecord :: Base는 클래스 메서드 validates_presence_ofbelongs_to.


Yehuda Katz는 자신의 블로그에서 이에 대해 잘 설명했습니다. 포인트 4 : Class Bodies Are n't Special 참조 .


Re : 이러한 메서드는 언제 어떻게 호출됩니까?

[클래스가로드 될 때 호출됩니다. 메서드 중 하나에 중단 점을 입력하고 레일스 프로젝트 시작의 일부로 호출되는지 확인할 수 있습니다.]

그들은 어떻게 정의됩니까?

[그들은 클래스 메소드입니다. 이것은 루비이기 때문에 여러 가지 방법으로 정의 할 수 있습니다.]

일부 활성 레코드 모듈에 믹스 인이 정의되어 있습니까?

[이 경우

validates_presence_of는 vendor / rails / activerecord / lib / active_record / validations.rb에 정의되어 있습니다.

belongs_to는 vendor / rails / activerecord / lib / active_record / associations.rb에 정의되어 있습니다.

ActiveRecord는 많은 믹스 인, 모듈 등을 포함하는 큰 시스템입니다.

메소드가 정의 된 위치를 확인하려면 각 메소드에 대해 http://www.gotapi.com/rubyrails사용 합니다. 정의 맨 아래에있는 "소스 표시"링크를 참조하십시오.

]


이들은 클래스 메서드 또는 '단일'메서드입니다. 여러분이 잘 알고 있어야 할 것은 attr_accessor입니다. 테스트 클래스에서 이와 같은 것을 구현할 수 있습니다.

class Klass
  def self.add_getter_and_setter(symbol)
    module_eval "def #{symbol}; @#{symbol}; end"
    module_eval "def #{symbol}=(val); @#{symbol} = val; end"
  end
end

class Person < Klass
  add_getter_and_setter :name
  add_getter_and_setter :phone
end

person = Person.new
person.name = 'John Smith'
person.phone = '555-2344'
person # returns <Person:0x28744 @name="John Smith", @phone="555-2344">

위의 예제에서 우리는 'def self.add_getter_and_setter'로 클래스 메소드를 만들었지 만 이것이 유일한 방법은 아닙니다.

class Klass
  class << self # opens the singleton class
    def add_getter_and_setter(symbol)  # note we dont specify self as it is already within the context of the singleton class
      ..
    end
  end
end

확장 사용. Module # extend는 클래스 메소드로 클래스를 확장하는 메소드입니다. Module # include 메소드는 인스턴스 메소드가있는 클래스를 포함합니다.

class Klass
  extend(Module.new do
    def add_getter_and_setter(symbol)
      ..
    end
  end)
end

Klass가 이미 정의 된 경우 다시 열어서 클래스 메서드를 추가 할 수 있습니다.

class Klass
end

def Klass.add_getter_and_setter(symbol)
  ..
end

# or 

class << Klass
  def add_getter_and_setter(symbol)
    ..
  end
end

글쎄, 이것들은 내가 이것을하는 방법을 아는 몇 가지 방법이므로 다른 구문을 보면 모두 같은 일을한다는 것을 깨닫습니다.

참고 : 레일에서 우리 모두가 사용하는 공통 클래스 메서드는 '찾기'입니다. Model 클래스에서 직접 실행됩니다.

person = Person.find(1) # finds a person with id:1

What you are seeing are class level methods for an ActiveRecord object. To write your own methods that perform like that you would write them as a plugin and then include them into ActiveRecord by re-opening the class definition. The Ruby on Rails guide to creating a plugin:

http://guides.rubyonrails.org/plugins.html

Covers how one would write such a plugin / class-level methods. Its a good document on how to wrap your head around what those kinds of methods mean and how they interact with instances.

참고URL : https://stackoverflow.com/questions/1344797/ruby-method-calls-declared-in-class-body

반응형