루비에서 개인 방법은 무엇입니까?
이 메서드는 정의된 클래스 내부에서만 호출할 수 있는 메서드 유형입니다.
이렇게 하면 메서드에 대한 액세스를 제어할 수 있습니다.
루비 메서드는 다음과 같습니다:
- 개인
- 공개(기본값)
- 보호
기본적으로 모든 방법은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
클래스에 정의 된 메소드 자체입니다.