루비

에서`자아`이해 오늘은self에 대해 이야기하고 싶습니다. 루비를 잠시 프로그래밍 해왔다면self이라는 아이디어를 내면화했을 것입니다. 당신이 프로그램을 읽거나 쓸 때마다,self은 당신의 마음 뒤에 있습니다.

그러나 경험이 적은 루비스트에게는self이 이해할 수 있습니다. 그것은 항상 변화하고 있지만 코드에 명시 적으로 표시되지 않습니다. 당신은 단지 알 것으로 예상됩니다.

초보자가 직면하는 많은 문제는self을 이해하지 못해서 발생합니다. 인스턴스 변수를”잃어 버렸거나”믹스 인에 어떤 데이터가 표시되는지 의아해 한 적이 있다면,그 맥락에서self을 이해하지 못했기 때문입니다.

이 게시물에서는 매일 다양한 상황에서self을 살펴볼 것입니다.

자기란 무엇인가?

당신은 사람들이 루비의 모든 것이 객체라고 말하는 것을 들었을 것입니다. 그것이 사실이라면 그것은 당신이 쓰는 모든 코드 조각이 어떤 객체에”속”한다는 것을 의미합니다.

self은 현재 실행 중인 코드를”소유”하는 개체를 가리키는 특수 변수입니다. 루비는 어디서나self을 사용합니다.:

  • 인스턴스 변수: @myvar
  • 메소드 및 상수 조회
  • 메소드,클래스 및 모듈을 정의 할 때.

이론적으로self은 꽤 분명합니다. 그러나 실제로는 까다로운 상황이 쉽게 나타날 수 있습니다. 그래서 내가 이 글을 썼다.

자아의 예

이제 몇 가지 예를 살펴 보겠습니다. 첫 번째 사람이 당신을 위해 너무 기본적인 것 같으면,그냥 계속 읽기. 그들은 더 고급 얻을.

인스턴스 메소드 내부

아래 코드에서reflect는 인스턴스 메소드입니다. 그것은 우리가Ghost.new를 통해 만든 객체에 속합니다. 그래서self은 그 객체를 가리 킵니다.

class Ghost def reflect self endendg = Ghost.newg.reflect == g # => true

클래스 메서드 내부

이 예에서reflectGhost의 클래스 메서드입니다. 클래스 메서드를 사용하면 클래스 자체가 메서드를”소유”합니다. self은 수업을 가리킨다.

class Ghost def self.reflect self endendGhost.reflect == Ghost # => true

그것은 모듈 내부의”클래스”메소드와 동일하게 작동합니다. 예를 들어:

module Ghost def self.reflect self endend Ghost.reflect == Ghost # => true

클래스와 모듈은 루비에서 객체로 취급된다는 것을 기억하십시오. 이 동작은 첫 번째 예제에서 본 인스턴스 메서드 동작과 크게 다르지 않습니다.

클래스 또는 모듈 정의 내부

레일과 같은 프레임 워크에 적합한 루비의 한 가지 특징은 클래스 및 모듈 정의 내에서 임의의 코드를 실행할 수 있다는 것입니다. 클래스/모듈 정의 안에 코드를 넣을 때 다른 루비 코드와 마찬가지로 실행됩니다. 유일한 차이점은self의 값입니다.

아래에서 볼 수 있듯이self은 정의 중인 클래스 또는 모듈을 가리킵니다.

class Ghost self == Ghost # => trueend module Mummy self == Mummy # => trueend 

믹스 인 메소드 내부

혼합 인 메소드는self과 관련하여”일반”인스턴스 또는 클래스 메소드처럼 작동합니다. 이 의미가 있습니다. 그렇지 않으면 믹스 인은 당신이 그것을 혼합 한 클래스와 상호 작용할 수 없습니다.

인스턴스 메서드

reflect메서드가 모듈에 정의되었더라도self메서드가 혼합된 클래스의 인스턴스입니다.

module Reflection def reflect self endend class Ghost include Reflectionendg = Ghost.newg.reflect == g # => true

클래스 메소드

클래스 메소드에 혼합 할 클래스를extend하면self은 일반 클래스 메소드에서와 똑같이 작동합니다.

module Reflection def reflect self endend class Ghost extend ReflectionendGhost.reflect == Ghost # => true

메타 클래스 내부

기회는 한 번에 많은 클래스 메소드를 정의하는이 인기있는 바로 가기를 본 적이 있습니다.

class Ghost class << self def method1 end def method2 end endend

class << foo구문은 실제로 꽤 흥미 롭습니다. 또한”싱글 클래스”또는”고유 클래스”라고-그것은 당신이 객체의 메타 클래스에 액세스 할 수 있습니다.”나는 미래의 포스트에서 메타 클래스를 더 깊이 다룰 계획이다. 하지만 지금은 메타클래스가 루비가 특정 객체에 고유한 메소드를 저장하는 곳이라는 것을 알아야 합니다.

class << foo블록 내부에서self에 액세스하면 메타 클래스가 나타납니다.

class << "test" puts self.inspectend# => #<Class:#<String:0x007f8de283bd88>

모든 클래스 외부

모든 클래스 외부에서 코드를 실행하는 경우 루비는 여전히self을 제공합니다. 그것은 포인트”메인”,이는 인스턴스입니다Object:

puts self.inspect # => main