Menu
CoddyTech

Защитные условия

Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 68 из 78.

Когда функции нужно выполнить несколько проверок, вложение одного if в другой заставляет основную работу уходить всё глубже:

func buy(gold: int, price: int) -> String:
	if price > 0:
		if gold >= price:
			return "Bought! %d gold left" % (gold - price)
		else:
			return "Not enough gold"
	else:
		return "Invalid price"

Защитная проверка меняет этот подход на противоположный. В начале функции она проверяет один недопустимый случай и сразу выходит с помощью return. Код после защитных проверок выполняется только при допустимых значениях, и ему не нужны вложенные блоки:

func buy(gold: int, price: int) -> String:
	if price <= 0:
		return "Invalid price"
	if gold < price:
		return "Not enough gold"
	return "Bought! %d gold left" % (gold - price)

buy(50, 30) возвращает Bought! 20 gold left, buy(10, 30) возвращает Not enough gold, а buy(50, 0) возвращает Invalid price.

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

func share(coins: int, players: int) -> int:
	if players <= 0:
		return 0
	return coins / players

В функции -> void защитным условием служит отдельный return. Внутри цикла continue работает как защитное условие для одного элемента: он пропускает недопустимый элемент, и цикл продолжается со следующим.

challenge icon

Задание

Легко

Напишите функцию process_data. Она принимает строку text и возвращает строку:

  1. Если text не является целым числом, верните Input must be a number!
  2. Если число равно 0, верните Cannot divide by zero!
  3. В противном случае разделите 100.0 на число и верните результат с двумя знаками после запятой

Например, process_data("8") возвращает 12.50, process_data("-5") возвращает -20.00, а process_data("abc") возвращает Input must be a number!.

Напишите обе проверки в виде защитных условий в начале функции.

Попробуйте сами

func process_data(text: String):
	# Напишите код здесь
	pass
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript