2015-06-02 2 views
0

Есть ли способ сделать этот код короче и проще?Эффект рубинового кода

loop do 
    if possibleSet.split(" ").map(&:to_i).any? {|e| (e<0 || e>12)} 
     print "Please enter valid numbers (between 1 and 12): " 
     possibleSet = gets 
     errorinput = false 
    else 
     errorinput = true 
    end 
    break if errorinput 
end 
+0

Что такое 'get'? – Edward

+0

Похоже, вы могли бы использовать до ключевого слова – floum

ответ

1

Refactored немного :)

loop do 
    print "Please enter valid numbers (between 1 and 12): " 
    possibleSet = gets.chomp 
    break unless possibleSet.split(" ").map(&:to_i).any? {|e| (e<0 || e>12)} 
    end 
+0

Большое вам спасибо! –

+0

'possibleSet' похоронен внутри' loop', что делает этот код непригодным. – mudasobwa

+0

это действительно @mudasobwa ... Я просто реорганизовал его код, как он пожелал, оставив исходную логику неповрежденной. –

0

Это разбирает ввод данных пользователем в массиве (не точно такое же поведение, но я надеюсь, что она чище, и вы можете работать там)

set = [] 
until set.all? {|i| (1..11).include?(i) } && !set.empty? do 
    set = gets.split(' ').map(&:to_i) 
end 
+0

Спасибо за это! –

+0

Приведенный выше код не войдет в цикл. – mudasobwa

+0

извините, что, добавил чек для set.empty? – floum

1

код ниже проверяет правильность ввода:

input = loop do 
    print "Please enter valid numbers (between 1 and 12): " 
          # ⇓⇓⇓ as many spaces as user wants 
    input = gets.chomp.split(/\s+/).map(&:to_i) rescue [] 
    break input unless input.empty? || input.any? { |i| !(0..12).include? i } 
end 
+0

Вызов диапазона 'include?' Делает это чище. Переключение на 'input.none? 'Устранит необходимость в отрицании. – tadman

+1

@tadman 'input.none?' Всегда выполняет N итераций, а 'input.any?' Может вернуться на первый. Преждевременная оптимизация :) – mudasobwa

+0

Это очень хороший момент! – tadman

Смежные вопросы