루비
에서`자아`이해 오늘은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
클래스 메서드 내부
이 예에서reflect
는Ghost
의 클래스 메서드입니다. 클래스 메서드를 사용하면 클래스 자체가 메서드를”소유”합니다. 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