запрашивает у пользователя правильный ввод

#ruby

#ruby

Вопрос:

Я хочу, чтобы эта программа получала массив и целое число от пользователя, а затем удаляла целое число из массива. Если целое число пользователя отсутствует в массиве, я хочу, чтобы им было предложено ввести новое целое число, которое есть. Я изо всех сил пытаюсь исправить цикл, поэтому появляется подсказка, если целое число неверно

 def enter_integer
  puts 'what would you like to remove from array?'
  interger = gets.chomp
  if array.include?(interger)
    array.delete(interger)
    print array
  end
end

def first_array
  puts 'please enter an array of numbers'
  array = gets.chomp

  array = array.split('')

  puts 'what would you like to remove from array?'
  interger = gets.chomp
  if array.include?(interger)
    array.delete(interger)
    print array
  end

  if interger != array.include?(interger)
    puts 'try another value'
    enter_integer
  end
end

first_array
  

Ответ №1:

Недопустимое сравнение

Среди других проблем, этот фрагмент кода не делает то, что вы думаете:

 # "interger" is the spelling given in the OP
if interger != array.include?(interger)
  

Массив #включить?возвращает логическое значение, поэтому ваш оператор if на самом деле не выполняет полезного сравнения. Ваша логика не только инвертирована, она также в основном делает это, что всегда будет верно, за исключением случаев, когда integer = true .

 integer != (true || false)
  

Рекомендуемый рефакторинг

Предполагая, что вы заполняете свой исходный массив с помощью пользовательского ввода (или любым другим способом), вы можете провести рефакторинг следующим образом:

 # populate initial array any way you like
array = [1, 2, 3, 4, 5]

loop do
  puts "Current array: #{array}"
  print 'Enter integer to delete ("X" to exit): '
  input = gets.chomp.upcase

  # you need a break condition to exit the loop    
  break if input == 'X'

  # make sure your value is cast as Integer
  input = input.to_i

  # use ternary operator to handle the result
  array.include?(input) ?
    array.delete(input) : STDERR.puts("invalid: #{input}")
end

# return your ending array
array
  

Конечно, есть и другие способы сделать это, но использование Kernel#loop с явным условием прерывания кажется мне самым простым. Ваш пробег может отличаться.

Ответ №2:

Я предполагаю, что ваш список выше отсутствует def enter_integer вверху.

Ключевая вещь, которую вам здесь не хватает, — это else ключевое слово:

 if array.include?(integer)
  array.delete(integer)
  print array
else
  puts 'try another value'
  enter_integer
end
  

Похоже, вы хотите выполнить цикл вместо того, чтобы пытаться только дважды, поэтому:

 def enter_integer
  puts 'what would you like to remove from array?'
  integer = gets.chomp
  if array.include?(integer)
    array.delete(integer)
    print array
    return true  # return keyword is probably unecessary here
  else
    return false  # return keyword is probably unecessary here
  end
end

def first_array
  ...
  result = enter_integer
  while !result do
    enter_integer
  end
  ...
end
  

Вероятно, вам также понадобится способ выхода из цикла без добавления допустимого целого числа.