2009-01-30 5 views
1

저는 C++ 응용 프로그램 내에 Ruby를 임베드했습니다. SWIG를 사용하여 바인딩을 생성했습니다.현재 RB 파일에서 실행중인 Ruby 클래스의 인스턴스를 얻는 방법은 무엇입니까? (C++에서 Ruby 임베디드)

기본적으로 루비 파일을 실행 한 다음 루비가 대신해서 C++ 클래스를 호출합니다.

이전 질문에 근거하여, 저는 루비 파일에 정의 된 클래스의 현재 인스턴스를 C++ 클래스로 가져와 인스턴스 메서드를 실행할 수 있도록하고 싶습니다. 스크립트

rb_eval_string_protect(<ruby script string>, &status); 

rb_funcall(Qnil, rb_intern("main"), 0); 

세계 주요 방법은 파일에 정의 된 클래스의 인스턴스를 만들고 다음과 같이

나는 루비 파일을 실행합니다. 그게 내가 따라야 할 사건이야.

필자는 매개 변수 나 다른 함수를 추가하여 인스턴스를 다시 전달할 것입니다. 그러나 C++에서 정의하는 방법을 잘 모르겠습니다. 따라서 SWIG에서 바인딩을 생성 할 때 모두 작동합니다.

도움을 주시면 감사하겠습니다.

이전 질문 : Calling Ruby class methods from C++

+0

를 호출 정상으로이 객체를 사용할 수 있습니다 당신은 참조. –

답변

1

루비의 C API를 그렇게 rb_eval_string_protect() 주어진 스크립트의 마지막 행의 값을 반환, 그리고 마지막 줄의 rb_funcall() 반환 VALUE, 루비의 기능적 특성을 보존하기 위해 최선을 다하고 있습니다 메소드가 호출되었습니다.

그래서 트릭은 실제로 순수 루비에서 인스턴스 값을 얻으시겠습니까?

// I'm some C (or C++) code 
VALUE main_retval; 
// ... 
rb_eval_string_protect("...", &status); 
main_retval = rb_funcall(Qnil, rb_intern("main"), 0); 

그리고 당신에게 main에 의해 반환 된 루비 객체에 대한 참조를 줄 것이다 : 그것은

# I'm a ruby script! 
main_retval = main() 

그런 다음 C에서 반환 값을 캡처 같은 주요 단지 반환 값의 경우와 유사하다.

당신은 아마 당신은 "이전 질문"에 대한 링크를 포함 할 수 방법 등

VALUE main_retval_as_string = rb_funcall(main_retval, rb_intern("to_s"), 0); 
+0

완벽하게 작동했습니다. 고맙습니다. –

관련 문제