2017-01-09 47 views
1

我試圖做這樣的事情,但我無法理解如何在我的C代碼中使用Ruby內部。如何在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; 
} 

我想要做的是傳中vdate作爲一個字符串,就像您的Date.parse(「YYYY-MM-DD」)

但首先,我認爲我需要知道如何用C語言爲Ruby創建或實例化新的Date類對象。我該怎麼做?

我有一個測試寫的代碼,這樣做。

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

輸出是

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

該代碼等同於'Date.new.parse'這可能不是你想要的。 – tadman

+0

代碼不連編譯,所以我想要的只是新的Date對象,所以我可以相應地使用它。我一直在尋找和尋找某種示例,但沒有運氣,所以即使只是一個鏈接將是很酷的 –

+0

嗯等待它編譯但我的tes t有NoMethodError:未定義的方法'new'for 18709:Fixnum –

回答

3

rb_intern返回internal ID for the name "Date"。你想要的是與這個名字相關聯的實際類,你可以得到與rb_const_get

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

然後,您可以使用此與rb_funcall創建Date類的新實例:

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

由於它看起來像你實際上想要調用Date.parse類的方法,你可能想要做的是直接在類上調用parse

VALUE parsed = rb_funcall(cDate, rb_intern("parse"), 1, rb_str_new_cstr("2017-1-9")); 
+0

是的!這看起來像我想要的。謝謝!你在這裏指出我正確的方向,因爲我不確定需要看什麼文檔。再次感謝馬特。 –

+0

有一點需要注意的是,當我調用該方法時,只要Ruby代碼中的某個地方需要'date',它就可以工作。但只要我刪除日期庫我得到'日期':未初始化的常量日期(NameError)。所以我沒有完成。這裏的目標是讓C代碼初始化Date類。任何更新? –

+0

馬特現在我該如何在我的C代碼中需要日期庫?我應該開始一個新的問題嗎?如果有人在我這樣做之前閱讀這些評論,我們現在只會看到。但謝謝你的回答。 –

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 

偉大工程只要我需要在我的Ruby代碼「日期」。但沒有,我沒有任何日期類初始化。 :-(哦,好吧,我正在學習

這是一個Ruby寶石,它仍在開發中,但我會分享它,以防有人想要玩弄它,原始寶石很好,但它確實不具備所有最新功能。這個名字是rubygems.org相同

calc_sun