2017-12-14 3 views
1

Ich benutze mruby 1.3.0 (2017-7-4) mit build_config.rb:Wie funktioniert const_get in mruby?

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 

I const_get Verfahren unterscheidet sich in mruby von in Ruby gefunden. In Ruby (2.4.0p0) gibt Class.const_get('Fixnum') die Konstante Fixnum zurück, während in mruby Class.const_get('Fixnum') die Fehlermeldung uninitialized constant Class::Fixnum (NameError) lautet.

Dann habe ich ein anderes Beispiel versucht: class Hoge; end; class Hoge::Fuga; end. In Rubin geben sowohl Class.const_get('Hoge::Fuga') als auch Hoge.const_get('Fuga') die Konstante Hoge::Fuga. In mruby gibt nur Hoge.const_get('Fuga')Hoge::Fuga zurück.

+0

Während ich Ihnen nicht erklären kann, wie 'const_get' in' mruby' funktioniert, bevorzuge ich diese Methode gegenüber der nativen Ruby-Version. Ich bin nicht sehr versiert in C-Code (ich weiß Beschämung), aber die direkte Antwort auf Ihre Frage ist [mruby 'Module # const_get'] (https://github.com/mruby/mruby/blob/master/src/class .C# L2296) und [ruby 'Modul # const_get'] (https://github.com/ruby/ruby/blob/trunk/object.c#L2417), wie Sie sehen können, da' mruby' leichtgewichtig ist eine leichtere Implementierung sowie – engineersmnky

Antwort

0

mruby Module#const_get funktioniert wie 2nd Argument (die inherit nach Superklassen suchen) false in CRuby. Wenn Sie stattdessen Object.const_get(:Integer) verwenden, sollte es sich genauso verhalten, wie Sie es in mruby und CRuby erwartet haben.

+0

Ich habe das zweite Argument von 'Module # const_get' übersehen, und da' Modul # const_get' in mruby nur 1 Argument benötigt, scheint die einzige Lösung 'Objekt # const_get' zu verwenden. Vielen Dank. – user7336686

Verwandte Themen