9

这是一个关于包含 .rb 文件的初学者问题。

我想访问在另一个 rb 文件中声明的数组。我的主程序是这样的:

#!/usr/bin/env ruby
load 'price.rb'
[...]
max_price = price[az][type] * 2
[...]

这是 price.rb :

price = {'us-east-1' => {'t1.micro' => 0.02, 'm1.small' => 0.08, 'c1.medium' => 0.165, 'm1.large' => 0.320 },
'us-west-1' => {'t1.micro' => 0.02, 'm1.small' => 0.08, 'c1.medium' => 0.165, 'm1.large' => 0.320 },
'eu-west-1' => {'t1.micro' => 0.02, 'm1.small' => 0.085, 'c1.medium' => 0.186, 'm1.large' => 0.340 }
}

当我运行主脚本时,出现此错误:

Error: undefined local variable or method `price' for main:Object

你怎么看 ?

4

5 回答 5

10

从一个文件导出数据并在另一个文件中使用它的最佳方式是类或模块。

一个例子是:

# price.rb
module InstancePrices
  PRICES = {
    'us-east-1' => {'t1.micro' => 0.02, ... },
    ...
  }
end

在另一个文件中,您可以require这样做。使用load不正确。

require 'price'

InstancePrices::PRICES['us-east-1']

您甚至可以使用以下方法缩短此时间include

require 'price'

include InstancePrices
PRICES['us-east-1']

不过,您所做的有点难以使用。适当的面向对象设计会将这些数据封装在某种类中,然后为其提供接口。直接公开您的数据与这些原则背道而驰。

例如,您需要一种InstancePrices.price_for('t1.micro', 'us-east-1')能够返回正确定价的方法。通过将用于存储数据的内部结构与接口分离,您可以避免在应用程序中创建巨大的依赖关系。

于 2012-08-23T17:33:05.283 回答
3

在一个小而简单的类中声明变量将是更清洁的解决方案恕我直言。

于 2012-08-23T14:03:31.043 回答
3

来自Ruby 论坛的引述:

请记住,使用 load 使局部变量保持在文件内的范围内。

这意味着您只能使用非本地价格变量;带有实例变量的示例:

@price = {'us-east-1' => {'t1.micro' => 0.02, 'm1.small' => 0.08, 'c1.medium' => 0.165, 'm1.large' => 0.320 }, 'us-west-1' => {'t1.micro' => 0.02, 'm1.small' => 0.08, 'c1.medium' => 0.165, 'm1.large' => 0.320 }, 'eu-west-1' => {'t1.micro' => 0.02, 'm1.small' => 0.085, 'c1.medium' => 0.186, 'm1.large' => 0.340 } }
于 2012-08-23T14:22:58.780 回答
2

您不能从另一个文件访问变量,但您可以从另一个文件访问函数

文件1.rb

# in case of script you may use 'global' variables (with $) 
# as they have scope visibility to this whole file 
$foo = 'bar'

def getFoo
    $foo
end

文件2.rb

require_relative 'file1.rb'
foo = getFoo
# ...
于 2019-10-22T06:02:00.177 回答
1

我想忘记文件。

想想类和方法。

几个选项是:

  • 将这些方法和变量放在一个类中的一个 .rb 文件中。

  • 将变量和方法放在不同的文件include

您需要考虑类和方法以及包含和扩展,以获得有意义的解决方案。

于 2012-08-23T14:12:19.400 回答