2017-01-09 2 views
1

이런 식으로 뭔가를하려고하지만 내 C 코드에서 Ruby 내부를 사용하는 방법을 이해하는 데 문제가 있습니다. 내가 뭘 원하는 문자열로 vdate의 패스Ruby C 확장 프로그램에서 Date 객체를 어떻게 만듭니 까?

static VALUE func_get_date_object(VALUE self, VALUE vdate){ 
VALUE rb_date; 
VALUE date; 
rb_date = rb_funcall(rb_intern("Date"), rb_intern("new"), 0);; 
date = rb_funcall(rb_date, rb_intern("parse"), 0); 
return date; 
} 

입니다 같은 당신 것 다음 Date.parse ('YYYY-MM-DD')

하지만 먼저 내가 방법을 알 필요가 있다고 생각을위한 루비를 위해 C에서 새로운 Date 클래스 객체를 생성하거나 인스턴스화한다. 어떻게해야할까요?

이 작업을 수행하는 코드에 대해 작성된 테스트가 있습니다.

def test_date 
    assert_equal('', @t.date(@t_date_str)) 
end 

출력

NoMethodError: undefined method `new' for 18709:Fixnum 
+0

그 코드가 아마하지 않은 Date.new.parse' '에 해당 rubygems.org에서 동일합니다. – tadman

+0

을 그 코드도하지 않습니다 컴파일 그래서 내가 원하는대로 그냥 새로운 Date 개체를 사용할 수 있습니다. 내가 찾고 있었어 어떤 종류의 예를 찾고 있지만 행운을 그래서 그냥 링크가 멋지다. –

+0

잘 컴파일하지만 내 테 t는 NoMethodError : 18709에 대해 정의되지 않은 메소드 'new': Fixnum –

답변

3

rb_interninternal ID for the name "Date"를 반환합니다. 당신이 원하는 것은이 이름과 관련된 실제 클래스, 당신은 rb_const_get와 것을 얻을 수 있습니다 :

rb_date = rb_funcall(cDate, rb_intern("new"), 0); 
:

VALUE cDate = rb_const_get(rb_cObject, rb_intern("Date")); 

그런 다음 Date 클래스의 새 인스턴스를 만들 rb_funcall 이것을 사용할 수 있습니다

VALUE parsed = rb_funcall(cDate, rb_intern("parse"), 1, rb_str_new_cstr("2017-1-9")); 
: 실제로 Date.parse 클래스 메소드를 호출하려고 한 것 같은데 때문에

는 당신이 아마하고 싶은 클래스에 직접 전화 parse입니다 매트에 515,

+0

예! 그게 내가 원하는 것처럼 보입니다. 감사! 그리고 당신은 내가 올바른 방향으로 나를 가르키고 있습니다. 나는 어떤 문서를보아야하는지 확신하지 못했습니다. 다시 한 번 감사드립니다. –

+0

한 가지주의 할 점은 그 메소드를 호출 할 때 루비 코드 어딘가에 '날짜'가 필요한 한 모든 것이 작동한다는 것입니다. 그러나 내가 date lib을 제거하자마자'date '를 얻는다 : 초기화되지 않은 상수 Date (NameError). 그래서 나는 끝나지 않았다. 목표는 C 코드가 Date 클래스를 초기화하도록하는 것입니다. 모든 업데이트? –

+0

Well Matt 어떻게 C 코드에서 Date 라이브러리가 필요합니까? 새로운 질문을 시작해야합니까? 이렇게하기 전에 누군가가이 주석을 읽으면 지금 보겠습니다. 그러나 당신의 대답에 감사드립니다. –

0

네 덕분에 내가 지금 가지고 :

/* 
* call-seq: 
* date('yyyy-mm-dd') 
* 
* convert input string to Date object. 
* 
*/ 
static VALUE func_get_date(VALUE self, VALUE vdate){ 
    VALUE cDate = rb_const_get(rb_cObject, rb_intern("Date")); 
    VALUE parsed = rb_funcall(cDate, rb_intern("parse"), 1, vdate); 
    return parsed; 
} 

그리고 시험은 다음과 같습니다

class TestCalcSun300 < Test::Unit::TestCase # MiniTest::Test 
    def setup 
    @t = CalcSun.new 
    @t_date_str = '2000-01-01' 
    @t_date = Date.parse('2000-01-01') 
    end 

    def test_date 
    assert_equal(@t_date, @t.date(@t_date_str)) 
    end 
end 

는 한 내 루비 코드에서 '날짜'를 요구하는 훌륭한 작품. 하지만 그것 없이는 어떤 Date 클래스도 초기화되지 않았습니다. :-(글쎄, 글쎄, 난 배웠어.

아직 개발중인 Ruby gem이지만, 누군가와 함께 놀고 싶다면 공유 할 것이다. 원래 보석은 좋지만 그렇다. 모든 최신 기능을 가지고 있지. 이름은 당신이 원하는

calc_sun