2012-08-23 108 views
4

這是一個關於包含.rb文件的問題。訪問在另一個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 

你這是什麼想想嗎?

+2

根據您需要該陣列可用的位置,您可以使用本指南調整變量的範圍:http://www.techotopia.com/index.php/Ruby_Variable_Scope – jefflunt

+1

感謝您的鏈接!幫助我解決問題 – PapelPincel

回答

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')將返回正確的價格。通過分離用於存儲接口數據的內部結構,可以避免在應用程序中創建巨大的依賴關係。

2

在一個小而簡單的類中聲明變量將是更清晰的解決方案。

1

我想忘記文件。

想想類和方法。

幾個選項是:

  • 把這些方法和變量類中一個名爲.rb文件。

  • 把他們

你需要考慮的類和方法的變量,並在不同的文件的方法和include和包括並延伸至有一個解決方案是有道理的。

2

引述從Ruby forum

請記住,使用負載保持局部變量在該文件內的範圍 。

,這意味着你可以使用只有當它是不是本地的價格變量;與實例變量的例子:

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

請不要在全局上下文中聲明實例變量。 – tadman

+1

@tadman - 因爲? – Vidul

+1

這是非常糟糕的形式。實例變量應該存在於特定類的上下文中。它們在默認範圍之外的任何範圍內都沒有用處。 – tadman

相關問題