2009-05-27 2 views
8

아래 예제에서 as stated elsewhere, k가 실제로 수신자 인 경우 "k.receive : hello"대신 "k.send : hello"라고 말하면 어떨까요?"k.send : hello"- k가 "수신자"이면 발신자는 누구입니까?

와 같은 소리는 수신기보다는 발신자입니다.

우리가 "k.send : hello"라고 보내는 사람이 누구인가?

은 (내가 당신이 같은 혼란 있습니까?)

스몰 토크에서
class Klass 
    def hello 
    "Hello!" 
    end 
end 
k = Klass.new 
k.send :hello #=> "Hello" 
k.hello   #=> "Hello" 

답변

6

이 코드가 포함 된 개체는 메시지 (아마도 main)를 전송합니다. 보다 명확한 객체와 일반적인 메시지 전달을 사용하여 살펴 보겠습니다. 이 코드의 마지막 줄에서

class Person 
    attr_accessor :first_name, :last_name 
    def initialize(first_name, last_name) 
    @first_name, @last_name = first_name, last_name 
    end 
    def marry(other) 
    self.last_name = other.last_name 
    end 
end 

bob = Person.new('Bob', 'Smith') 
patty = Person.new('Patricia', 'Johnson') 

patty.marry bob 

는 주요 패티에 marry를 보내고, 차례로 패티는 자신에게 last_name=를 보내고 밥 last_name를 보냅니다.

+0

"패티가 자기 자신과 결혼하는 것"보다는 "메인이 패티와 결혼하는 것"을 어떻게 알 수 있습니까? – lorz

+1

패티는 우리의 메시지에 응답하여 결혼 방법을 수행하고 있습니다. 우리는 결혼 방법을 삭제하고 method_missing을 구현할 수 있으며, 더 이상 결혼 방법이 없다고하더라도 메시지를보고 응답 할 수 있습니다. – Chuck

+0

죄송합니다. 이해하기가 어렵습니다. 나는 아직도 주인이 패티 라기보다는 메시지의 기원임을 마지막 지점에서 증명하는 이유를 얻지 못하고 있습니다. – lorz

7

이 모든 것이 객체입니다. "발신자"는 메시지가 발생한 범위의 소유자 (즉, "this"또는 "self"포인터) 인 객체입니다.

이전과 마찬가지로 Ruby는이 개념을 상속합니다. 덜 추상적 인 용어로, 내가 편지를 게시하면, 나는 "발신인"(나의 사무실에서 왔음)이고, 당신은 "수신자"(앞면의 주소는 당신의 것이다)입니다. 그래서 나는 foo.send myLetter라고 쓰고 싶다. 너, foo는 내 편지를 받는다. 보낸 사람은 암시 적입니다. 코드 소유자는 "게시"를 수행합니다.

+0

흠. 아직도 이것에 대해 정말로 혼란 스럽습니다. Java에서 왔습니다. 그래서 저는 객체에 대한 메소드를 호출합니다. 이 송수신 개념이나 다른 용어와는 다른가요? – lorz

+0

그것은 단지 다른 용어입니다 : "call"은 "send message"를 읽습니다. "나는 부름 받았어", "나는 수신기 다"라고 읽는다. –

+1

그것은 단지 다른 용어가 아니다. 해당하는 방법이없는 메시지를 보낼 수 있습니다. 존재하지 않는 메소드는 호출 할 수 없습니다. – Chuck

2

내가 혼란스러워하는 부분을 볼 수 있지만 문제는 대체로 의미가 있습니다. 귀하의 주장은 k이므로 send 메서드가 실제로 receive이어야하며 메시지가 인입니다. 평이한 영어로, "k는 messsage 'hello'로 보내지 않고"hello '(누구에게?) "라는 메시지를 보냄으로써 k.send :hello을 읽습니다. 메시지에 응답하지 않을 수 k, k 그것을 무시하도록 선택할 수 있습니다 -

방법은 "수신"이름을 바꿀 수 있지만, 그 k하지 메시지를 수신 할 수 있기 때문에, 또한 잘못된 약간의 또는 k은 다른 개체로 전달할 수도 있습니다. Ruby (그리고 Ruby에 영향을 준 Smalltalk)에서 메서드는 요청을 보다 더 많이 수행합니다. 명령을 사용하면 명령을 실행합니다.

+1

네, 내 의미 론적 혼란을 이해했습니다. 그러나 나는 당신의 요점을 이해하지 못합니다. "k는 메시지를받지 못할 수도 있습니다 - k는 메시지에 응답하지 않을 수도 있고, k는 그것을 무시할 수도 있고, k는 그것을 다른 객체에 전달할 수도 있습니다."어떻게 가능합니까? k는 메시지를 무시합니까? – lorz

+1

스몰 토크에서 똑같은 메서드는 perform :이라고 불리는데, 이것은 훨씬 더 좋은 이름이라고 생각합니다. – Chuck

+0

@ lorz : k는 'hello'메소드를 구현하지 않았거나 구현시 아무 것도하지 않을 수도 있습니다. 또는 다른 객체에 메시지를 전달할 수 있습니다. 나의 "선택 안함"선택은 좋지 않을 수 있습니다 (예를 들어 자바에서는 아무것도하지 않는 메소드 구현이 가능합니다). @ Chuck : 동의합니다. Cocoa 프레임 워크는 performSelector라는 이름을 사용합니다. – mipadi