嵌入式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 但是,当我们要求在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来获得正确的行为.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |