2017-01-09 51 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