如何在Ruby C扩展中创建Date对象?
我试图做这样的事情,但我无法理解如何在我的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
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"));
是的!这看起来像我想要的。谢谢!你在这里指出我正确的方向,因为我不确定需要看什么文档。再次感谢马特。 –
有一点需要注意的是,当我调用该方法时,只要Ruby代码中的某个地方需要'date',它就可以工作。但只要我删除日期库我得到'日期':未初始化的常量日期(NameError)。所以我没有完成。这里的目标是让C代码初始化Date类。任何更新? –
马特现在我该如何在我的C代码中需要日期库?我应该开始一个新的问题吗?如果有人在我这样做之前阅读这些评论,我们现在只会看到。但谢谢你的回答。 –
是感谢马特我现在有:
/*
* 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相同
该代码等同于'Date.new.parse'这可能不是你想要的。 – tadman
代码不连编译,所以我想要的只是新的Date对象,所以我可以相应地使用它。我一直在寻找和寻找某种示例,但没有运气,所以即使只是一个链接将是很酷的 –
嗯等待它编译但我的tes t有NoMethodError:未定义的方法'new'for 18709:Fixnum –