2009-05-27 2 views
5

Java의 "호출자"는 Ruby의 "수신자"와 동일합니까?

x.hello() 

Java에서 개체 x는 포함 된 메서드를 "호출"합니다.

Ruby에서 객체 x는 그 객체에 포함 된 메소드를 "수신 중"입니다.

똑같은 생각을 표현하기위한이 용어가 다른 용어인가, 아니면 이데올로기의 근본적인 차이점이 있습니까?

자바에서 나온 루비의 "수신기"아이디어는 꽤 당혹 스럽습니다. 아마도 누군가 Java와 관련하여 이것을 설명 할 수 있을까요?

+2

개체 x가 포함하고있는 메서드를 "호출"하고 있다고 말하지 않습니다. 나는 * object *에 * 메서드를 호출한다고 말할 것이다. (내 머리가 약 3/4 속도와 1/2 야망으로 오늘 뛰고 있기 때문에 나는 이것을 육체로 만들지 않을 것이다.) –

+0

당신이 말하는 것은 에릭슨의 대답과 일치합니다. – lorz

+1

그래. 그럼 내가 그를 투표 할 것 같아. –

답변

12

예에서 x이 아니고hello()입니다. 해당 스 니펫이 포함 된 객체가 무엇이든 "호출"합니다 (즉, 호출자). Java에서 x은 수신자라고 할 수 있습니다. hello() 메서드에 대한 호출을 받고 있습니다.

5

내가 틀렸다면 누군가가 나를 수정하지만,이 용어를 Java에 적용 할 수 있다고 생각하지 않습니다. Ruby는 Smalltalk에서 제공되며, 메시지 인 (메소드 아님)을 사용하여 객체간에 통신합니다. 기술적으로, Ruby에서 myObj.to_s을 실행하면 메시지가 myObj으로 전송되고 그에 따라 해당 메시지가 처리됩니다. 이 모델에서는 myObj이 실제로이 메시지의 수신자이며 메시지를 보낸 행을 소유 한 클래스가 발신자입니다.

자바에서는 존재하지 않습니다. 메소드를 호출하는 객체가 있습니다. 발신자와 수신자가 없습니다. 당신이 이데올로기에 근본적인 차이가 있다고 말하면 당신이 옳았습니다.

+1

내 생각은 너와 일치했을 텐데 너를 뽑은 사람이 이유를 설명했으면 좋겠어. – lorz

+2

이것은 단지 용어입니다 :'this'는 수신자 포인터입니다.'sun.reflect.Reflection.getCallerClass'와 같은 메소드를 사용하여 발신자 (또는 호출자)를 검색 할 수 있고 is_a 메시지를 전송할 수 있습니다. –

+0

예 ... 설명이 좋을 것 같아서 좋습니다. –

6

차이점은 용어가 아닙니다. Java에서 VM은 주어진 객체가 전송하려는 메시지 (즉, 호출하려는 메서드)를 "수락"하는지 여부를 결정합니다. 객체의 유형 공간이 해당 메소드를 정의하지 않으면 예외가 발생하고 메시지는 전달되지 않습니다.

루비에서 메시지는 이며 항상입니다. 객체는 일치하는 메소드를 찾을 수도 있고 그렇지 않을 수도 있습니다. 후자의 경우에는 을 던질 수도 있고이되지 않을 수도 있습니다. Rails는 이러한 근본적인 차이를 기반으로합니다. 이는 DB 기반 웹 애플리케이션 프레임 워크가 아직 Java 플랫폼의 레일만큼 유용하지 않은 이유 중 하나입니다 (일부는 가까워지고 있지만).

+0

왜이 기능이 Rails에 이점이 있습니까? – lorz

+1

한 가지 예가 ActiveRecord의 ORM입니다. 데이터베이스 행을 나타내는 ActiveRecord 객체가 있습니다 (예 : 책). 그것은 열에 해당하는 메소드가 없지만 @ book.isbn과 같은 것을 할 수 있습니다. @book은 메시지를받습니다. isbn 메소드가 없다는 사실을 알게되면 연결된 데이터베이스 테이블에서 해당 이름의 열을 찾습니다. 이름이 올바른 열을 찾으면 값을 반환합니다. 호출자에게는 값을 반환 한 메서드 호출처럼 보입니다. –

+1

나는 본다. 따라서 method_missing은 런타임에 메소드를 찾을 수 없을 때 기어를 바꿀 수있는 기능을 담당합니다. – lorz