создание хеша одной строкой в ​​ruby - PullRequest
0 голосов
/ 07 июня 2009

Как я могу очень просто создать хеш в ruby, используя что-то простое, например, "times"

У меня есть @date (т.е. = Date.today), а затем количество дней ... скажем, 5

5.times { |i| @date_range[:day] = (@date+i).strftime("%Y-%m-%d") }

Я знаю, что должно быть что-то очень простое, чего не хватает.

Спасибо ...

Ответы [ 4 ]

7 голосов
/ 08 июня 2009

Date объекты также Comparable, так что вы можете создать Range:

@range = @date..(@date + 10)

Вы можете легко выполнить итерацию и вывести результаты. Если вы хотите получить доступ к определенной дате численно, вы можете сделать:

@date_range = (@date..(@date + 10)).to_a
@date_range[1]

Или, если вам действительно нужно предварительно отформатировать даты, как в вашем примере:

@date_range = (@date..(@date + 10)).map { |date| date.strftime("%Y-%m-%d") }
@date_range[1]

Последняя строка будет эквивалентна вашему @date_range[1] (равно завтра / @date + 1), хотя на самом деле это Array, а не Hash. Hash с последовательными цифровыми клавишами не имеет большого смысла: вы получаете их бесплатно с Array и , в качестве бонуса порядок значений сохраняется. По моему мнению, использование Range s для начала немного проясняет намерение, но это не впечатляющая разница.

1 голос
/ 10 июня 2009

Вам нужен хеш, который содержит сегодняшнюю дату плюс ключ хеша?

today = Date.today
days = Hash.new { |h,k| h[k] = (today + k).strftime( '%Y-%m-%d' ) }

Это имеет то преимущество, что не ограничивается несколькими днями. Это будет работать для любого ключа. Кроме того, расчет происходит только один раз для каждого ключа и по мере необходимости.

1 голос
/ 08 июня 2009

Это похоже на работу ...

(1..10).each { |i| @date_range[i] = (@date+i).strftime("%Y-%m-%d") }
0 голосов
/ 08 июня 2009

вы можете использовать collect для создания массива в одну строку, но я не уверен, куда входит ваш хэш ...

@date_range = 5.times.collect { |i| (@date+i).strftime("%Y-%m-%d") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...