루비 개인 및 보호 방법:방법 가시성 이해

루비에서 개인 방법은 무엇입니까?

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

이렇게 하면 메서드에 대한 액세스를 제어할 수 있습니다.

루비 메서드는 다음과 같습니다:

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

기본적으로 모든 방법은public입니다.

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

하지만private또는protected방법을 만들어 변경할 수 있습니다.

왜 이것이 유용합니까?

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

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

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

이제:

새 버전을 릴리스합니다…

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

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

이 기억:

공개 메서드를 적게 사용하면 클래스 내에서 변경의 자유를 높일 수 있습니다.

몇 가지 코드 예제를 보자!

루비

에서 개인 메소드 이해”개인 메소드 호출”오류 메시지를 본 적이 있습니까?

이 하나:

self.puts 123# NoMethodError: private method `puts' called

그런 다음private메서드를 잘못 사용하려고 했습니다.

전용 메서드 자체만 사용할 수 있습니다.

예:

puts 123

그것은 같은 방법이지만,당신은 그것을 이렇게 불러야합니다.

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

즉…

:

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

에서 포함 된 메소드 이것은 당신이 그들을 정의하는 클래스 외부에서 개인 메소드를 호출 할 수 없음을 의미합니다.

에는”명시 적 수신기”가 필요하기 때문입니다.

이 규칙을 무시하려면send과 같은 방법을 사용합니다.

send(:puts, "apple")

private방법을 어떻게 정의합니까?

def bacon "private bacon"endprivate :bacon

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

개인 메서드를 넣을 위치

클래스에 둘 이상의 개인 메서드가 있는 것은 정상입니다.

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

이 작업을 수행:

class Food def public_method end private def bacon end def orange end def coconut endend

private이후의 모든 인스턴스 메서드는 전용 메서드가 됩니다.

private_class_method :method_name클래스 메서드를 프라이빗

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

퍼블릭 메소드

퍼블릭은 루비의 기본 메소드 가시성입니다.

다음은 예입니다:

def orange "Vitamin C"end

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

food.orange

메서드를 비공개로 설정하거나 보호한 경우 메서드를 다시 공개로 설정할 수 있습니다.

public :orange

보호된 방법은 무엇입니까?

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

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

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

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

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

하지만protected으로이 코드가 작동합니다!

개인 대 보호 된 메소드

그 차이,protected는 메소드private를 유지하지만 객체에서 해당 메소드를 호출 할 수 있다는 사실입니다.

비공개로name만 수행 할 수 있으며 보호 된 상태에서object.name만 수행 할 수 있습니다.

언제 보호해야 합니까?

같음(==)방법과 같이 매우 구체적인 경우가있는 경우에만.

루비 문서는 가능하면protected대신private를 사용하는 것이 좋습니다.

이 메모가 있습니다.:

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

나는 이것에 대해 궁금해서 몇 가지 벤치 마크를 실행했다:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

이는 성능면에서 8.5%의 차이입니다.

비디오 자습서

요약

루비 메소드 가시성,공개,비공개&보호 메소드에 대해 배웠습니다. 이들은 루비 키워드가 아니며Module클래스에 정의 된 메소드 자체입니다.



+