访问在另一个rb文件中声明的变量

时间:2012-08-23 13:59:44

标签: ruby

这是一个关于包含.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

您怎么看?

5 个答案:

答案 0 :(得分:6)

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

一个例子是:

# 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')。通过将用于存储数据的内部结构与接口分开,可以避免在应用程序中创建巨大的依赖关系。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

来自Ruby forum

的引用
  

请记住,使用load会将局部变量保留在其范围内   在文件中。

这意味着只有在不是本地的情况下才能使用 price 变量;实例变量的示例:

@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 } }

答案 3 :(得分:1)

我想忘记文件。

考虑类和方法。

有两种选择:

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

  • 将变量和方法放在不同的文件中,include将它们放在

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

答案 4 :(得分:0)

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

file1.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

file2.rb

require_relative 'file1.rb'
foo = getFoo
# ...