2011-01-04 5 views
3

は、私が働いているコードです:Rubyでどのように配列を取り込むのですか?ここで

class Trader 

    def initialize(ticker ="GLD") 
    @ticker = ticker 
    end 

    def yahoo_data(days=12) 

    require 'yahoofinance' 

    YahooFinance::get_historical_quotes_days(@ticker, days) do |row| 
     puts "#{row.join(',')}" # this is where a solution is required 
    end 
    end 
end 

yahoo_data方法は、ヤフーファイナンスからデータを取得し、コンソール上の価格履歴を置きます。しかし、単純なputsのエーテルに蒸発する代わりに、どのようにオブジェクトとして後で操作することができます配列を生成するために、上記のコードを使用します。線に沿って

何か:

do |row| populate_an_array_method(row.join(',') end                            

答えて

4

あなたはget_historical_quotes_daysにブロックを与えていない場合は、配列が返されます。 mapを使用して、joinという結果の配列を取得できます。

一般に、ruby 1.8.7以来、ほとんどのイテレータメソッドはブロックなしで呼び出されたときに列挙型を返します。したがって、foo.bar {|x| puts x}が1,2,3の値を出力する場合、enum = foo.barは値1,2,3を含む列挙型を返します。 arr = foo.bar.to_aを実行すると、配列[1,2,3]が表示されます。

(この規則に準拠しない、おそらくいくつかのライブラリーから)これを実行しないiteratorメソッドを持っている場合は、barによって得られたすべての値を含む列挙を取得するためにfoo.enum_for(:bar)を使用することができます。

仮にget_historical_quotes_daysがまだ配列を返さなかった場合は、YahooFinance.enum_for(:get_historical_quotes_days).map {|row| row.join(",") }を使用して必要なものを得ることができます。

+0

これは私が思ったよりも簡単でした。私がブロックをコメントアウトすると、 'a'という新しいオブジェクトを作成し、 'a.yahoo_data'を呼び出すと、配列が取得されます。また、 'q = a.yahoo_data'のような変数を代入すると、q.classの呼び出しは 'Array'を返します。 q.lengthは '8'を返します。 – Milktrader

関連する問題