Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby Private &Protected 메서드:메서드 가시성 이해

Ruby의 private 메소드란 무엇인가요?

정의된 클래스 내부에서만 호출할 수 있는 메서드 유형입니다.

이를 통해 메소드에 대한 액세스를 제어할 수 있습니다.

Ruby 메소드는 :

  • 비공개
  • 공개(기본값)
  • 보호

기본적으로 모든 메소드는 public입니다. .

누구나 사용할 수 있습니다!

그러나 메소드를 private로 만들어서 이것을 변경할 수 있습니다. 또는 protected .

이것이 유용한 이유는 무엇입니까?

이러한 방법을 더 쉽게 변경할 수 있기 때문입니다.

직장에서 몇 가지 다른 프로젝트에서 사용할 코드 라이브러리를 작성한다고 상상해 보세요.

이러한 프로젝트가 라이브러리를 구현하면 사용자가 만든 클래스에서 메서드를 호출하게 됩니다.

지금 :

새 버전을 출시합니다...

하지만 public에서 이름을 변경하기로 결정했습니다. 방법.

그러면 이 방법을 사용하는 모든 프로젝트에서 오류가 발생합니다!

기억 :

공용 메서드를 줄이면 클래스 내에서 자유롭게 변경할 수 있습니다.

몇 가지 코드 예제를 살펴보겠습니다!

Ruby의 비공개 메소드 이해

"private method called" 오류 메시지를 본 적이 있습니까?

이것 :

self.puts 123

# NoMethodError: private method `puts' called

그런 다음 private를 사용하려고 했습니다. 방법이 잘못되었습니다.

private 메소드는 단독으로만 사용할 수 있습니다.

:

puts 123

같은 방법이지만 이렇게 불러야 합니다.

개인 메서드는 항상 self 컨텍스트 내에서 호출됩니다. .

즉...

비공개 방법만 사용할 수 있습니다. :

  • 같은 클래스의 다른 메서드
  • 상위 클래스에서 상속된 메소드
  • 모듈에 포함된 메서드

즉, private 메소드를 정의하는 클래스 외부에서 private 메소드를 호출할 수 없습니다.

"명시적 수신자"가 필요하기 때문입니다.

그렇지 않다면...

send와 같은 방법을 사용합니다. 이 규칙을 우회합니다.

send(:puts, "apple")

private를 정의하는 방법 방법?

좋아요 :

def bacon
  "private bacon"
end

private :bacon

private라는 단어 자체는 키워드가 아니라 Kernel에 정의된 메소드입니다. 모듈.

비공개 방법을 놓을 위치

클래스가 두 개 이상의 private 메소드를 갖는 것은 정상입니다.

이러한 방법을 어디에 배치합니까?

이렇게 하세요 :

class Food
  def public_method
  end

  private

  def bacon
  end

  def orange
  end

  def coconut
  end
end

모든 인스턴스 메소드 private 뒤 비공개 방법이 됩니다.

<블록 인용>

private_class_method :method_name을(를) 사용할 수 있습니다. 클래스 메서드를 private로 정의하려는 경우

먼저 모든 공개 메서드를 정의한 다음 private을 정의하는 것이 일반적인 패턴입니다. 클래스 끝에 함께 메서드를 제공합니다.

공개 방법

공개는 Ruby의 기본 메소드 가시성입니다.

예시 :

def orange
  "Vitamin C"
end

food 개체가 있는 경우 orange을 정의하는 , 다음과 같이 호출할 수 있습니다.

food.orange

메서드가 비공개로 설정되었거나 보호된 경우 다시 공개로 설정할 수 있습니다.

좋아요 :

public :orange

보호된 방법이란 무엇입니까?

보호된 방법은 덜 일반적입니다.

private와 같습니다. 메서드를 호출할 수 있지만 직접 호출하는 것이 아니라 개체에서 호출할 수 있습니다.

비공개로 이 예를 시도하면 오류가 발생합니다:

class Food
  def initialize(name)
    @name = name
  end

  def ==(other)
    name == other.name
  end

  protected

  attr_reader :name
end

food = Food.new("chocolate")

puts food == food

name 때문에 오류가 발생합니다. 비공개이므로 other.name을(를) 수행할 수 없습니다. .

하지만 protected 이 코드는 작동합니다!

비공개 방법과 보호 방법

차이점은 protected 메소드를 private로 유지 하지만 개체에서 해당 메서드를 호출할 수도 있습니다.

비공개를 사용하면 name만 수행할 수 있습니다. , protected로 object.name을(를) 할 수 있습니다. .

protected는 언제 사용해야 하나요?

등호(==)와 같이 매우 특정한 경우에만 ) 방법.

Ruby 문서에서는 private 사용을 권장합니다. protected 대신 가능하면 언제든지.

이 메모가 있습니다 :

<블록 인용>

"보호된 메서드는 인라인 캐시를 사용할 수 없기 때문에 속도가 느립니다."

이에 대해 궁금해서 몇 가지 벤치마크를 실행했습니다. :

public:    2813891.9 i/s
private:   2699273.8 i/s
protected: 2572122.0 i/s

8.5%의 성능 차이입니다.

동영상 튜토리얼

요약

Ruby 메서드 가시성, 공개, 비공개 및 보호 메서드에 대해 배웠습니다. Ruby 키워드가 아닙니다. , Module에 정의된 메소드 자체입니다. 수업.

더 많은 사람들이 이 주제를 이해할 수 있도록 이 게시물을 공유해주세요!

읽어주셔서 감사합니다 🙂