加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

嵌入式ruby的奇怪行为

发布时间:2020-12-17 02:02:36 所属栏目:百科 来源:网络整理
导读:我们在嵌入式 ruby应用程序中观察到一种奇怪的行为.我们已经将代码简化为极少,并且能够重新生成该问题.以下是详细信息. 1.ruby代码 #!/usr/bin/env ruby#require "MyLibrary.so" *// Works fine*module AA class BC def initialize end def loadFunction req
我们在嵌入式 ruby应用程序中观察到一种奇怪的行为.我们已经将代码简化为极少,并且能够重新生成该问题.以下是详细信息.

1.ruby代码

#!/usr/bin/env ruby
#require "MyLibrary.so"   *// Works fine*
module AA
  class BC
    def initialize
    end

    def loadFunction
      require "MyLibrary.so" *//Gives error*
    end
  end
end


#Invoke the method  
AA::BC.new().loadFunction

2. MyLibrary.so的源代码

#include "ruby.h"

const char loop[] =  
   "def loopFuncn"  
     "puts "HERE"n"  
   "endn"  

   "beginn"  
     "loopFunc()n"  
   "rescue StandardErrorn"  
     "puts $!n"  
     "puts $!.classn"  
   "endn";  

void initialize()  
{  
     ruby_init();  
     ruby_init_loadpath();  
     rb_eval_string(loop);  
}

extern "C" void Init_MyLibrary()  
{
    initialize();
}

当我们在rb文件中的loadFunction中需要“MyLibrary.so”文件时,我们收到以下错误

undefined方法`loopFunc’用于main:Object
NoMethodError

但是,当我们要求在rb文件的顶部一切正常.

我们的第一个猜测是rb_eval_string()在模块AA中执行.所以loopFunc在模块AA中定义而不是全局.因此报告了NoMethodError.当我们在cpp文件中调用AA :: BC.new().loopFunc()时,该方法被成功调用;这证实了我们的猜测.

这是从嵌入式ruby角度来看的预期行为,因为如果我们需要一个rb文件(而不是.so)与传递给rb_eval_string的代码相同,我们就不会收到任何错误.

解决方法

rb_eval_string()确实定义了调用它的模块中的方法.我们可以使用rb_require / rb_load来获得正确的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读