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

Ruby 및 Ruby on Rails에서 메서드를 위임하는 방법

이 문서는 Ruby의 메서드 위임에 관한 것입니다.

delegate을 사용하는 방법을 배우게 됩니다. 메소드, Forwardable 모듈 및 SimpleDelegator 수업.

위임이 필요한 이유 ?

객체 지향 프로그래밍에서는 클래스가 함께 작동하는 두 가지 방법이 있습니다.

그들은 :

  • 상속
  • 구성

상속을 사용하면 부모 클래스가 상속받은 모든 클래스와 메서드, 상수 및 인스턴스 변수 정의를 공유하는 클래스 계층 구조를 만들 수 있습니다.

예를 들어 :

Ruby에서 모든 객체는 Object에서 상속됩니다. 기본적으로 클래스입니다.

이것이 puts와 같은 메소드에 액세스할 수 있는 이유입니다. , class &object_id .

합성을 통해 클래스는 다른 클래스에서 객체를 생성(또는 제공)한 다음 이 객체를 사용하여 작업을 위임합니다.

예를 들어 :

컴퓨터는 여러 부품(객체)으로 이루어져 있으며 각 부품은 한 가지 일을 잘 할 줄 압니다.

화면에 무언가를 렌더링하고 싶다면 컴퓨터는 그래픽 카드에 무엇을 보여줄지 알려주지만 어떻게 하는지는 알려주지 않습니다.

구성입니다. !

하지만 여러분이 컴퓨터이고 그래픽 카드 방식에 대한 액세스 권한을 부여하고 싶다면 어떻게 해야 할까요?

그들 사이에 일종의 "다리"를 구축해야 합니다.

방법을 알아보겠습니다.

Ruby 메소드 위임 – 예제

두 가지 수업이 있습니다:

  • Computer
  • Memory

다음 코드 제공 :

class Computer def initialize @memory =Memory.new endendclass Memory def initialize @data =[] end def write(data) @data < 

Computer를 통해서만 메모리에 액세스할 수 있기를 원합니다. .

여러 가지 이유가 있을 수 있습니다. :

  • 메모리 단위는 1개뿐입니다. 즉, 1개의 메모리 개체만 필요합니다. 하나의 개체에 액세스를 중앙 집중화하면 이를 달성할 수 있습니다.
  • 메모리에 액세스할 수 있는 사람(다른 애플리케이션)과 그들이 사용할 수 있는 메모리 부분을 제어하려고 합니다.
  • 보안 또는 디버깅 목적으로 모든 메모리 액세스를 기록하려고 합니다.

이제 이렇게 하려고 하면 :

computer.write("rubyguides")

NoMethodError와 함께 실패합니다. write가 없기 때문에 Computer의 메소드 .

#에 대한 정의되지 않은 '쓰기' 메서드(NoMethodError)

Computer 클래스는 write가 의미하는 바를 모릅니다. .

그렇지 않다면...

write를 만듭니다. 방법!

방법은 다음과 같습니다. :

class Computer def initialize @memory =Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) endend

요청을 @memory로 전달하고 있습니다. 개체.

메소드 위임입니다.

<블록 인용>

참고 :이것은 이러한 메소드를 공개 인터페이스의 일부로 만들고(모든 사람이 사용할 수 있게 됨) 항상 원하는 것은 아닙니다.

일종의 메서드 위임에 대한 바로 가기가 있습니까? ?

네!

살펴보겠습니다...

전달 모듈 사용 방법

지금 :

Forwardable을 사용할 수 있습니다. 위임자 메서드를 정의하기 위해 Ruby에 포함된 모듈입니다.

이렇게 작동합니다 :

'forwardable' 클래스 필요 컴퓨터 확장 전달 가능 def_delegators :@memory, :read, :write def initialize @memory =Memory.new endend

이렇게 하면 이전에 만든 메서드를 제거할 수 있으며 동일한 작업을 수행합니다.

Forwardable은 메소드 인수(블록 포함!)를 처리하므로 이에 대해 걱정할 필요가 없습니다.

멋지지 않아? 🙂

Rails 위임 방법을 사용하는 방법

Rails 또는 ActiveSupport gem을 단독으로 사용하는 경우 delegate에 액세스할 수 있습니다. 방법.

작동 방식입니다 :

class Computer delegate :read, :write, to::@memory def initialize @memory =Memory.new endend

delegate 메소드는 prefix를 사용합니다. 메서드 이름에 접두사를 추가할 수 있는 인수입니다.

:

class Computer delegate :read, :write, 접두어:"memory", to::@memory def initialize @memory =Memory.new endend

두 가지 방법으로 결과 :

  • memory_read
  • memory_write

SimpleDelegator로 모든 것을 위임하는 방법

방금 배운 이러한 기술은 특정 메서드를 전달하거나 위임하는 데 사용됩니다.

그러나 개체를 래핑하고 모든 메서드를 노출하려면...

SimpleDelegator를 사용할 수 있습니다. 수업!

방법은 다음과 같습니다. :

'delegate'class CoolArray 필요  

이제 CoolArray new에 전달하는 객체처럼 작동합니다. .

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

원래 클래스를 변경하지 않고도 이 개체에 새 메서드를 추가할 수 있습니다.

동영상 튜토리얼

요약

Ruby의 개체 구성과 다양한 기술을 사용하여 메서드를 위임하는 방법을 배웠습니다!

이 기사가 마음에 드셨다면 공유해 주세요. 루비 친구들과 함께하세요.

읽어주셔서 감사합니다 🙂