использовать ruby ​​'gets' в блоке

Этот код работает как надо:

puts "pick 1:"
num_1 = gets.chomp
array.detect { |k| k.id == num_1.to_i }

...
puts "pick n:"
num_n = gets.chomp
array.detect { |k| k.id == num_n.to_i }

Я не собираюсь повторно использовать переменную 'num' где-либо еще, поэтому я хотел не назначать gets переменной и использовать ее в блоке, например:

puts "Pick 1:"
array.detect { |k| k.id == gets.chomp.to_i }

В консоли иногда работает иногда нет. Если это не так, я застрял в функции.

Является ли это незаконным использованием или я должен как-то обернуть gets?


person zombie_ghast    schedule 19.09.2015    source источник
comment
Вы вызываете gets в каждом элементе массива, не так ли?   -  person undur_gongor    schedule 19.09.2015
comment
Я вижу, он вызывается несколько раз, потому что он находится в массиве.   -  person zombie_ghast    schedule 19.09.2015
comment
В стороне: gets.to_i возвращает то же значение, что и gets.chomp.to_i, поэтому вы часто видите, что chomp опущено. Если s = gets #=> "123\n", s.int #=> 123 по той же причине, что и "3 blind mice".to_I #=> 3.   -  person Cary Swoveland    schedule 19.09.2015


Ответы (1)


Два сценария имеют два разных значения/результата.

В первом вы читаете число из ввода, сохраняете его, а затем сравниваете все элементы массива с этим значением.

Вместо этого во втором скрипте, поскольку код «чтения из ввода» находится внутри блока, он будет выполняться как часть detect итераций. Поэтому вам будет предложено ввести одно значение (одно и то же значение?) столько раз, сколько элементов в массиве.

Согласно тому, что вы спрашиваете, первый, вероятно, правильный подход.

person Simone Carletti    schedule 19.09.2015