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

Pap*_*cel 7 ruby

这是一个关于包含.rb文件的问题.

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

#!/usr/bin/env ruby
load 'price.rb'
[...]
max_price = price[az][type] * 2
[...]
Run Code Online (Sandbox Code Playgroud)

这是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 }
}
Run Code Online (Sandbox Code Playgroud)

当我运行主脚本时,我收到此错误:

Error: undefined local variable or method `price' for main:Object
Run Code Online (Sandbox Code Playgroud)

你怎么看 ?

tad*_*man 7

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

一个例子是:

# price.rb
module InstancePrices
  PRICES = {
    'us-east-1' => {'t1.micro' => 0.02, ... },
    ...
  }
end
Run Code Online (Sandbox Code Playgroud)

在另一个文件中你可以require这样做.使用load不正确.

require 'price'

InstancePrices::PRICES['us-east-1']
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过以下方式缩短此时间include:

require 'price'

include InstancePrices
PRICES['us-east-1']
Run Code Online (Sandbox Code Playgroud)

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

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