2017-01-09 10 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; 
} 

私は何をしたいことはDate.parseのためにあなたのような文字列としてvdateになり渡しです(「YYYY-MM-DD」)

しかし、最初に、私は方法を知っておく必要があると思いますRuby用にCで新しいDateクラスオブジェクトを作成またはインスタンス化します。どうすればいいですか?

私はこれを行うコードのために書かれたテストを持っています。

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

出力はinternal ID for the name "Date"を返しrb_intern

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

このコードはおそらくされていないDate.new.parse' 'と同等ですrubygems.orgに同じである。 – tadman

+0

をこのコードはさえません私が欲しいのは、新しいDateオブジェクトだけですので、それを使用することができます。私は探していましたが、いくつかの例を探していましたが、結局のところ、リンクだけでもうまくいくでしょう。 –

+0

私のテスtにNoMethodErrorがあります:18709の未定義メソッドnewです:Fixnum –

答えて

3

です。何が欲しいのは、この名前に関連付けられた実際のクラスで、あなたはrb_const_getとのことを得ることができます:

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

あなたはその後、Dateクラスの新しいインスタンスを作成するためにrb_funcallでこれを使用することができます。

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

VALUE parsed = rb_funcall(cDate, rb_intern("parse"), 1, rb_str_new_cstr("2017-1-9")); 
:あなたが実際に Date.parseクラスのメソッドを呼び出したいように見えますので

は、どのようなあなたはおそらくやりたいことは、クラスの直接呼び出しparseです

+0

Yep!それは私が望むように見える。ありがとう!そして、私はここで正しい方向に向いています。私はどんなドキュメントを見ているのかよく分かりませんでした。もう一度おねがいします。 –

+0

私はそのメソッドを呼び出すときに、Rubyコードのどこかに「日付」が必要な限り、すべてが機能するという注意点が1つあります。しかし、私は日付のlibを削除するとすぐに私は 'date 'を得る:初期化されていない定数Date(NameError)。だから私はやっていない。ここでの目標は、CコードでDateクラスを初期化することです。どんな更新? –

+0

さて、マット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 
限り、私は私のRubyコードで「日付」を必要とする偉大な作品

。しかしそれがなければ、私はDateクラスを初期化する必要はありません。 :-(まあ、私は学んでいます。

これはまだ開発中ですが、誰かがそれを試してみたい場合に備えて共有します。元の宝石は良いですがすべての最新の機能を持っていない。名前は何をしたい

calc_sun

関連する問題