2017-12-14 8 views
1

私はbuild_config.rbmruby 1.3.0 (2017-7-4)を使用します。mrubyでconst_getはどのように機能しますか?

MRuby::Build.new do |conf| 
    if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] 
    toolchain :visualcpp 
    else 
    toolchain :gcc 
    end 
    enable_debug 
    conf.gembox 'default' 
    conf.gem :git => 'https://github.com/mattn/mruby-uv' 
    conf.gem :git => 'https://github.com/mattn/mruby-http' 
    conf.gem :git => 'https://github.com/iij/mruby-socket' 
    conf.gem :git => 'https://github.com/luisbebop/mruby-polarssl.git' 
    conf.gem :git => 'https://github.com/iij/mruby-digest' 
    conf.gem :git => 'https://github.com/iij/mruby-pack' 
    conf.gem :git => 'https://github.com/matsumoto-r/mruby-simplehttp.git' 
    conf.gem :git => 'https://github.com/matsumotory/mruby-httprequest' 
    conf.gem :git => 'https://github.com/iij/mruby-aws-s3.git' 
end 

MRuby::Build.new('host-debug') do |conf| 
    if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] 
    toolchain :visualcpp 
    else 
     toolchain :gcc 
    end 

    enable_debug 
    conf.gembox 'default' 
    conf.cc.defines = %w(MRB_ENABLE_DEBUG_HOOK) 
    conf.gem :core => "mruby-bin-debugger" 
end 

MRuby::Build.new('test') do |conf| 
    if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] 
    toolchain :visualcpp 
    else 
    toolchain :gcc 
    end 
    enable_debug 
    conf.enable_bintest 
    conf.enable_test 
    conf.gembox 'default' 
end 

私はルビーでからmrubyの異なるconst_get方法を見つけました。ルビー(2.4.0p0)の場合、Class.const_get('Fixnum')は定数Fixnumを返し、mruby Class.const_get('Fixnum')の結果はエラーuninitialized constant Class::Fixnum (NameError)になります。

次に、別の例を試しました:class Hoge; end; class Hoge::Fuga; end。ルビーでは、Class.const_get('Hoge::Fuga')Hoge.const_get('Fuga')の両方が定数Hoge::Fugaを与えます。 mrubyでは、Hoge::Fugaを返すのはHoge.const_get('Fuga')です。

+0

私は 'const_get'が' mruby'でどのように動作するのか説明できませんが、実際はネイティブのルビーバージョンよりもこの方法が好まれます。私はCコードに精通していません(私は残念ですが)。あなたの質問に対する直接の答えは[mruby 'Module#const_get'](https://github.com/mruby/mruby/blob/master/src/class)です。 .c#L2296)と[ruby 'Module#const_get'](https://github.com/ruby/ruby/blob/trunk/object.c#L2417)のように、' mruby'は軽量であることがわかります – engineersmnky

答えて

0

mrubyのModule#const_getは、第2引数(スーパークラスを検索するためにinheritと名付けられます)のように機能します。falseはCRubyにあります。 Object.const_get(:Integer)を代わりに使用すると、mrubyとCRubyの両方で期待どおりに動作するはずです。

+0

私は 'Module#const_get'の2番目の引数を見落としました。mrubyの' Module#const_get'は1つの引数しか取らないので、唯一の解決策は 'Object#const_get'を使用しているようです。ありがとうございました。 – user7336686