Я подозреваю, что есть более чистый, более идиоматичный, Ruby-способ решить эту загадку, чем то, что я сделал. Я слишком новичок в Руби, чтобы подтвердить. Все мои поиски не касались вопроса о том, как лучше написать Ruby в приведенных ниже примерах.
Загадка, мне нужно взять строковый ввод и превратить его в матрицу. Строки разделены '\n'
, элементы строки - ' '
например. строковый ввод "2 6 4\n7 9 8"
имеет вывод [[2, 6, 4], [7, 9, 8]]
Т.е. матрица:
2 6 4
7 9 8
Это мое решение:
@rows = in_string.split(/\n/).map{|str| str.split(' ').map{|ch| ch.to_i}}
Объяснение того, что происходит
"2 6 4\n7 9 8"
=> разделить на новую строку => ["2 6 4", "7 9 8"]
- отобразить элементы от 1. до разделения на
' '
=> [["2", "6", "4"], ["7", "9", "8"]]
- отобразить элементы 2., чтобы они стали
int
с (это происходит один раз для каждой строки)
- фин. У нас есть результат, который мы после
Мне кажется, что этот код не очень читабелен, но я пришел из ржавчины, поэтому я не привык к хорошему стилю
Я недостаточно знаком с Ruby, чтобы понять хорошие способы написания таких решений. Я пытался использовать больше строк, как это
@rows = in_string.split(/\n/).map{
|str| str.split(' ').map{
|ch| ch.to_i
}
}
Но я все еще чувствую себя оставленным в темноте от того, что можно считать хорошим стилем, или какие другие варианты доступны.
Правильность кода в порядке. Для меня отличный ответ - это тот, который даст мне понимание того, на что нужно обращать внимание при рассмотрении подобных проблем в будущем, и больше уверенности в моем понимании того, что делает элегантный код Ruby.
РЕДАКТИРОВАТЬ из ответов
Пока что предложений
- использовать значение по умолчанию для разделения
- использовать значения по умолчанию на карте
- используйте
do-end
(я еще учусь). Если кто-то захочет это отредактировать, просто фантастика.
Вот чем я закончил:
@rows = in_string.split(/\n/).map( |chrs| chrs.split.map( &:to_i ) )