2010-04-16 4 views
2

내 C + + 프로그래밍 숙제를 자극하는 방법으로, 나는 C++을 책에서 내 컴퓨터로 타이핑하는 대신 Ruby에서 개혁하기로 결정했습니다. 예, 그것은 바보 같지만 지루합니다.void foo (int & x) -> 루비? 참조로 정수 전달하기?

어쨌든, 난 상응하는 루비 코드 기능 내부 것이 무엇

void swap(int &a,int &b){ int c=b; b=a; a=c } 

루비

에 기능의이 종류를 변환하는 데 문제?

답변

6

를 작성하여 교환 루비 엄격하게 패스에 의해 값. 항상. 그러나 때로는 그 값은 사기꾼입니다. 이 모두가 "자바"라고하면서, 그들이 정말로 말을해야

참고 : 여기에

링크의 부부의 "스몰 토크와 자손" 루비 (Ruby)와 다른 언어들도 제공합니다.

  1. 루비 값으로 참조를 전달합니다

    나는 혼란의 대부분은이 문제에서 비롯된 생각합니다. 그러나 그 문장에서 "reference"라는 단어는 "pass-by-reference"에서 "reference"라는 단어와 동일하지 않습니다. 아마 우리가 모호해질 때 명확하다 : "pass-by-variable"과 "reference"를 "pointer"("good"well-behaved poointers, "bad" C에서 "들) 가

    • 을 통과하여 가변
    • 루비가 통과하여 값과 통과 값 poointers가
  2. 참고 문헌 (poointers 대부분 임) 루비 통과 포트란된다 것을 변경 가능한 객체를 가리 킵니다. 따라서 참조를 변경할 수 없지만 참조가 가리키는 개체를 변경할 수 있습니다. 여기서 문제는 Ruby (대부분의 명령형 객체 지향 언어와 마찬가지로)가 ID, 상태 및 값의 개념을 혼란스럽게한다는 점입니다.당신은 여기 수정 (그들은 "Clojure의"를 말하는 동안, 제시 개념이 보편적이며, OO에 동일하게 적용 할 수 있습니다)에 그 문제와 방법에 대해 자세히 알아볼 수 있습니다 :

은 BTW : 나는 의도적으로 객체 지향은 분명히 내가, 내가 개체에 대한 불투명 한 참조에 대해 이야기하고 원시 메모리 주소에 대해 이야기하고 있지 않다 있는지 확인하기 위해 OO와 "poointers을"의 철자가 틀리 (및 명백한에 대한 나는 "참조"라는 단어를 사용하고 싶지 않은 이유들 ; "포인터"도 "참조"도 아닌 더 나은 단어를 안다면 나는 그것을 듣고 싶습니다.)

+0

외관상으로는 크게 논쟁의 여지가 있습니다 http://www.ruby-forum.com/topic/41160 – Earlz

+0

자바와 자바 스크립트가 같은 값으로 전달된다는 것은 사실입니다. –

+0

@ Erlz : 이것은 다른 언어 커뮤니티 간의 용어에 대한 의견 차이입니다. Java의 객체는 같은 방식으로 동작하며 값으로 전달합니다. – newacct

1

루비에서는 인수가 값으로 전달됩니다. 그래서 다음과 같은 방법은 어떤 효과가 없을 것입니다 반면에

def doesnt_swap(a, b) 
    c = a 
    a = b 
    b = c 
end 

를, 대부분의 사람들의 객체는 예 문자열에 대한 참조입니다, 그래서 당신은이의 문자열 값을 교환 할

def swap_strings(a, b) 
    c = a.dup 
    a.replace(b) 
    b.replace(c) 
end 

를 작성할 수 두 가지 주장.

정수는 즉각적이므로 정수는 replace과 같습니다. swap_integers을 쓸 수 없습니다.

어쨌든, 루비, 당신은 a, b = b, a

+1

"복싱"정수 또는 참조로 전달하도록 강요하는 방법이 없습니까? – Earlz

+0

@ Erlz : 정수가 일부 개체의 멤버 인 경우 개체의 인스턴스 변수 값을 바꿀 수 있습니다. 다른 범위에서 로컬 변수에 액세스 할 수 없습니다. – Chuck

+0

@Earlz : 글쎄, (SimpleDelegator를 사용하여) 글쎄, 루비에서는 절대 볼 수 없을 것이다. –

관련 문제