Как заполнить массив в Ruby? - PullRequest
3 голосов
/ 04 января 2011

Вот код, с которым я работаю:

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 получает данные из Yahoo Finance и выводит историю цен на консоль. Но вместо простого размещения, которое испаряется в эфир, как бы вы использовали предыдущий код для заполнения массива, которым впоследствии можно будет манипулировать как объектом.

Что-то вроде:

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

1 Ответ

4 голосов
/ 04 января 2011

Если вы не передадите блок 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].

Если есть метод итератора, который этого не делает (возможно, из какой-то библиотеки, которая не придерживается этого соглашения), вы можете использовать foo.enum_for(:bar) для получения перечислимого объекта, содержащего все значения, полученные из bar.

Итак, гипотетически, если get_historical_quotes_days еще не вернул массив, вы можете использовать YahooFinance.enum_for(:get_historical_quotes_days).map {|row| row.join(",") }, чтобы получить то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...