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変数がローカルでない場合にのみ使用できることを意味します。インスタンス変数の例:

@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 に答える
1

私はファイルを忘れると思います。

クラスとメソッドについて考えてみましょう。

いくつかのオプションは次のとおりです。

  • これらのメソッドと変数を 1 つの .rb ファイルのクラス内に配置します。

  • 変数とメソッドを別のファイルに入れ、includeそれらを

理にかなった解決策を得るには、クラスとメソッド、インクルードとエクステンドを考える必要があります。

于 2012-08-23T14:12:19.400 に答える