2017-12-14 4 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 상수를 반환하고 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은 CRuby에서 inherit이라는 수퍼 클래스 검색을 위해 false이라는 두 번째 인수처럼 작동합니다. Object.const_get(:Integer)을 대신 사용하면 mruby와 CRuby에서 예상했던 것과 동일하게 동작해야합니다.

+0

나는 Module # const_get'의 두 번째 인수를 간과 했으므로 mruby의 Module # const_get은 단지 하나의 인수 만 사용하기 때문에 유일한 해결책은'Object # const_get'을 사용하는 것 같습니다. 고맙습니다. – user7336686