Ruby를 배우고 있다면 "self" 키워드의 사용이 매우 혼란스러울 수 있습니다.
어떻게 작동합니까?
self
이란? , 정확히?
Ruby 키워드입니다. 현재 개체에 대한 액세스를 제공합니다.
<블록 인용>물건이 무엇인지 모르신다면 제가 만든 이 영상을 보세요. 객체 지향 프로그래밍과 관련이 있습니다.
이 "현재 개체"는 컨텍스트에 따라 다릅니다.
문맥?
예, 컨텍스트는 주어진 순간에 코드가 있는 위치입니다.
예시 :
코드가 인스턴스 메서드 안에 있는 경우 self
인스턴스입니다. 그 클래스의. 즉, self
개체입니다.
이 작업을 직접 볼 수 있습니다.
이 코드 실행 :
def coffee puts self end coffee # main
이 코드는 coffee
를 정의하고 호출합니다. self
의 값을 출력하는 메소드 .
main
이 인쇄되는 이유 ?
최상위 개체의 이름이기 때문에 외부에 정의된 모든 메서드를 찾을 수 있는 개체입니다. 수업.
coffee
좋아요 방법입니다.
그러나 Cat
라는 클래스 내부에 메서드를 정의하면 , self
Cat
개체.
여기에서 볼 수 있듯이 :
class Cat def meow puts self end end Cat.new.meow # <Cat:0x7a14c5>
이 예에서 우리는 self
의 값이 어디에 사용하느냐에 따라 달라집니다.
지금 :
목적을 이해하면 무엇이든 더 잘 이해할 수 있다고 생각합니다.
self
가 왜 유용한가요?
몇 가지 예를 살펴보겠습니다.
명확성을 위해 자아 사용
self
의 실제 사용 메소드와 로컬 변수의 차이점을 구분할 수 있도록 하는 것입니다.
변수와 메서드의 이름을 동일하게 지정하는 것은 좋은 생각이 아닙니다. 그러나 그 상황에서 작업해야 하는 경우 self.method_name
을 사용하여 메서드를 호출할 수 있습니다. .
제 말은 다음과 같습니다. :
class Example def do_something banana = "variable" puts banana puts self.banana end def banana "method" end end Example.new.do_something # "variable" => puts banana # "method" => puts self.banana
여기에 banana
가 있습니다. do_something
내부의 지역 변수 방법이지만 banana
도 있습니다. 방법.
지역 변수가 우선합니다.
이것이 self
를 사용해야 하는 이유입니다. 여기에서 전화를 원하시면 banana
방법, 인쇄 대신 banana
의 값 변수.
다음 :
좀 더 일반적인 사용 사례를 살펴보겠습니다... 클래스 메서드 정의!
Self를 사용하여 클래스 수준 메서드 정의
self
의 첫 번째 용도 , 의심할 여지 없이 클래스 수준 메서드를 정의하는 것입니다.
본 적이 있을 것입니다.
이러한 def self.method_name
메소드 정의 .
좋아요 :
class Salad def self.buy_olive_oil # ... end end Salad.buy_olive_oil
이 self
이것은 Salad
와 동일합니다. , 클래스 이름.
이것이 유용한 이유는 무엇입니까?
각 메서드 정의에 대해 클래스 이름을 사용할 필요가 없기 때문에 클래스를 변경하면 코드를 더 쉽게 변경할 수 있습니다.
또한 코드를 덜 시끄럽고 읽기 좋게 만듭니다.
이것이 우리가 def self.buy_olive_oil
을 수행하는 이유입니다. def Salad.buy_olive_oil
대신 .
자신을 위한 다른 용도
네!
self
에는 더 많은 용도가 있습니다. , 따라서 익숙해지면 도움이 됩니다.
예를 들어 :
현재 개체를 다른 개체와 비교하는 메서드에서 사용할 수 있습니다.
이런 것 :
def ==(other) self == other end
self
를 사용할 수도 있습니다. 디버깅 목적으로 작업 중인 개체를 확인합니다.
좋아요 :
p self
또는 반환 값으로 사용하여 빌더 디자인 패턴과 같은 디자인 패턴을 구현할 수 있습니다.
예 :
class Salad def initialize @ingredients = [] end def add_nuts @ingredients << :nuts self end end my_salad = Salad.new.add_nuts
요약하자면, 다음은 자신을 위한 유용한 용도 목록입니다. :
- 클래스 수준 메서드 정의
- 동일한 이름의 지역 변수가 있는 경우 인스턴스 메소드 사용
- Returning Self(빌더 패턴)
- 디버깅
- 객체 비교(==)
- 메소드 호출의 기본 수신자
자기 대 자기 자신
이 주제를 끝내기 전에 한 가지 더 살펴보아야 합니다.
Kernel#itself
방법.
개체에 대해 호출할 수 있는 메서드이며 개체는 자체적으로 반환합니다.
예 :
[1,2,3,nil].select(&:itself) # [1, 2 ,3]
이 예제는 nil
을 필터링합니다. &false
가치.
차이점 이해 :
self
는 키워드입니다. 값은 위치에 따라 다릅니다. 당신은 그것을 사용itself
방법이다. 가치는 무엇에 따라 달라집니다. 사용하는 개체(1.itself
에서 ,1
개체)
도움이 되기를 바랍니다.
결론
Ruby self 키워드에 대해 정확히 무엇인지, 왜 유용한지, 어떻게 사용하는지 배웠습니다.
이제 여러분이 시도해 볼 차례입니다.
읽어 주셔서 감사합니다! 🙂