3

我有一个令人困惑的问题。我想从另一个调用一个 ruby​​ 脚本。

考虑到这一点,我创建了一个 testscript.rb 并执行了它,它包含这段代码,

 require './paypal.rb'
 puts paypal['L_AMT0']

此代码返回一个数字,这是我的贝宝余额。它依赖于使用 ruby​​-paypal gem 的 paypal.rb 文件。当我执行 ruby​​ testscript.rb 时,我得到了我的贝宝余额的输出,这意味着它工作正常。这告诉我,我从另一个 RB 调用一个 RB 的方法没问题,因为在上述场景中,testscript.rb 正在获取一个从 paypal.rb 返回的变量。

使用相同的逻辑,我将上述代码插入到另一个名为 SiriProxy 的程序中。这是一个红宝石程序。我需要它来获得我的贝宝余额。

所以在那个程序里面,我做了一个require paypal.rb,它失败了,因为它找不到它,所以我在require中设置了一个绝对路径来修复它。

但是,当 SiriProxy(另一个 ruby​​ rb 给我一个问题)尝试运行 puts paypal['L_AMT0'] 时,它会导致错误并结束程序。

这是错误,

[Info - Plugin Manager] Say: Checking Paypal Balance
/home/siriproxy/.rvm/gems/ruby-1.9.3-p194@SiriProxy/gems/siriproxy-0.3.0/plugins/siriproxy-example/lib/siriproxy-example.rb:47:in `block in <class:Example>': undefined local variable or method `paypal' for #<SiriProxy::Plugin::Example:0x931a228> (NameError)
    from /home/siriproxy/.rvm/gems/ruby-1.9.3-p194@SiriProxy/bundler/gems/cora-1edcfb9073d5/lib/cora/plugin.rb:47:in `instance_exec'
    from /home/siriproxy/.rvm/gems/ruby-1.9.3-p194@SiriProxy/bundler/gems/cora-1edcfb9073d5/lib/cora/plugin.rb:47:in `block (2 levels) in process'

在上面的输出中,问题似乎是它不理解“paypal”,如下所示:

未定义的局部变量或方法“paypal”

但是,我不明白为什么,因为在 testscript.rb 我做了完全相同的事情并且它有效。

任何人都可以帮忙吗?谢谢你。

4

2 回答 2

0

似乎@CodeGnome 是对的。

从内核文档:

要求(名称)→真或假

加载给定的名称,如果成功则返回 true,如果已加载功能则返回 false。

require_relative(string) → true or false

Ruby 尝试相对于所需文件的路径加载名为 string 的库。如果无法确定文件的路径,则会引发 LoadError。如果加载了文件,则返回 true,否则返回 false。

于 2012-06-25T03:29:59.143 回答
0

从当前目录加载文件

我对您的库或其内部结构一无所知,但看起来您的 require 语句可能是错误的。如果你想从 Ruby 1.9.3 的当前目录加载文件,你应该使用:

require_relative 'paypal'

捆绑器和宝石

如果它是您作为捆绑包的一部分安装的 gem(例如 gem 是在 Gemfile 中定义的),那么在您的 require 语句中提供路径是错误的。相反,您需要按如下方式要求捆绑的 gem:

require 'bundler/setup'
require 'paypal'
于 2012-06-25T02:41:19.853 回答