#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
Вероятно, вам также понадобится способ выхода из цикла без добавления допустимого целого числа.