Что такое условные предложения?

В Ruby бывают случаи, когда мы хотим проверить условие, а затем на его основе выполнить определенные действия. Они называются условными и помогают вашим данным выполнять правильные действия в нужное время.

Есть слова, которые помогают определить, по какому пути должен пойти ваш код. Это if, each, elsif и else. Мы собираемся узнать, что означает каждое из этих слов и как оно предоставляет коду определенный путь, которым нужно следовать.

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

Кроме того, предполагается определенный уровень знаний о хэшах. Если вы не совсем понимаете хеш-коды, не волнуйтесь - вы все равно сможете следить за ним.

Примеры условных предложений

Vanilluxe и Darmanitan - два покемона, которые мы будем использовать, чтобы лучше понимать условные выражения. См. Ниже набор данных, на который мы будем ссылаться.

darmanitan = {
  pokedex_number: 555,
  type: "fire",
  weight: 204.8,
  hp: 105,
  attack: 140,
  defense: 55,
  weak_to: "water"
}

vanilluxe = {
  pokedex_number: 584,
  type: "ice",
  weight: 126.8,
  hp: 71,
  attack: 95,
  defense: 85,
  weak_to: "fire"
}

Как видите, у нас есть имя каждого покемона, номер Pokedex, тип, вес, HP (очки жизни), характеристика атаки, характеристика защиты и их тип слабости.

Операторы if
операторы if - это самый простой способ понять условные выражения в Ruby. Когда мы добавляем if, текст, следующий сразу за ним, является условием, которое мы проверяем. Если это правда, строка ниже будет запущена.

if darmanitan[:type] == “fire”
   “Darmanitan is a fire type Pokemon."
end
# => “Darmanitan is a fire type Pokemon."

В приведенном выше примере мы проверяем, равен ли тип Дарманитана (двойное равенство, ==, проверяет достоверность) fire. Поскольку тип Дарманитана действительно огненный, строка «Дарманитан - покемон огненного типа». был возвращен.

операторы else
операторы else повышают ставку, но совсем немного. Операторы else основаны на операторе if . Он следует той же логике, что и оператор if, но добавляет условие, которому компьютер должен следовать, если он не упадет в if дорожка. Важное примечание: может быть только одно утверждение. Вот пример.

if darmanitan[:weak_to] == vanilluxe[:type]
   “Darmanitan is weak to ice and will lose.”
else “Darmanitan will win.”
end
# => "Darmanitan will win."

Мы проверяем, совпадает ли типичная слабость Дарманитана (огонь) с типом Vanilluxe (лед). Если так, Дарманитан проиграет, как гласит первая возвращенная строка. В данном случае слабость типа Darmanitan не совпадает с типом Vanilluxe, поэтому данные передаются оператору else. Это напечатает «Дарманитан победит».

Операторы elsif
Чтобы завершить наше понимание условных операторов Ruby, мы закончим с помощью оператора elsif. Оператор elsif предлагает нашему компьютеру третий вариант. Сначала он проверяет оператор if, затем проверяет оператор elsif, чтобы увидеть, и если он не проверяется, он возвращается к оператору else . Пример ниже.

if vanilluxe[:type] == “poison”
   “Vanilluxe is a poison type Pokemon.”
elsif vanilluxe [:type] == “electric”
   “Vanilluxe is an electric type Pokemon.”
else “I am unsure of Vanilluxe’s type."
end
# => "I am unsure of Vanilluxe's type."

В приведенном выше примере оператор if проверяет, является ли тип Vanilluxe ядовитым. Мы знаем, что тип Vanilluxe - лед, а не яд, поэтому переходим к выражению elsif. Это проверка, является ли тип Vanilluxe электрическим, а мы (все еще) знаем, что это не так. Поскольку ни один из операторов if или elsif не был истинным, мы заканчиваем и возвращаем все, что связано с оператором else («Я не уверен в типе Vanilluxe. . »).

Что такое сравнения?

Теперь, когда мы лучше понимаем, что такое условные операторы, мы можем немного усложнить их, используя операторы сравнения. Некоторые примеры операторов сравнения: >, <, >=, <=, !=, &&, ||. Давайте сразу перейдем к примеру, так как станет очевидно, как они используются в сочетании с условными операторами.

Пример 1: >, <, >=, <=

if darmanitan[:pokedex_number] <= 494
   “Darmanitan was introduced before Generation 5.”
else
   “Darmanitan was introduced after Generation 5.”
end
# => "Darmanitan was introduced after Generation 5."

Как вы можете видеть в приведенном выше примере, у нас есть инструкции if и else. Мы улучшили наш оператор if, добавив <= (знак «меньше или равно»). Мы проверяем, меньше ли число Pokedex Дарманитана 494, что указывает на то, что он был введен до поколения 5. Это не так, поэтому он переходит по пути else и возвращает утверждение «Дарманитан был представлен после 5-го поколения ». Остальные операторы, не упомянутые в этом примере, >, <, >= (больше, меньше и больше или равно) работают таким же образом.

Пример 2: !=

if darmanitan[:type] != "ice"
   "Darmanitan's type is not ice."
end
# => "Darmanitan's type is not ice."

Каждый раз, когда мы добавляем ! перед =, он становится оператором не равным. Как мы видим выше, мы проверяем, не является ли тип Дарманитана ледяным. Поскольку тип Дармантиана огненный (не ледяной), этот оператор считается действительным и возвращает утверждение «Тип Дармантиана не ледяной».

Пример 3: && и ||

if darmanitan[:type] == "fire" && darmanitan[:attack] >= vanilluxe[:hp]
  "The attack was super effective!"
end
# => "The attack was super effective!"

&& и || известны как оператор и и оператор или соответственно. Как вы видите в приведенном выше примере, мы проверяем два условия. Во-первых, мы проверяем, является ли Дарманитан огненным типом. Мы также проверяем, превышает ли состояние атаки Дарманитана HP Vanilluxe или равно ему. При использовании && операторы на обеих сторонах оператора должны быть действительными, прежде чем переходить к оператору возврата. В этом случае действовали оба утверждения! «Атака была суперэффективной!» был возвращен.

if vanilluxe[:weak_to] == darmanitan[:type] || vanilluxe[:hp] >= darmanitan[:attack]
   “Vanilluxe would lose in a battle to Darmanitan.”
end
# => “Vanilluxe would lose in a battle to Darmanitan.”

В последнем примере мы используем оператор или (||). При использовании ||, только один оператор по обе стороны от оператора должен быть действительным, прежде чем переходить к оператору возврата. Мы проверяем два утверждения… первое, если типовая слабость Ванильюкс такая же, как и у Дарманитана. Второе утверждение - увидеть, больше ли HP Vanilluxe, чем показатель атаки Дарманитана. В этом случае верно только первое утверждение. Поскольку мы используем или оператор, нам нужно было передать только один оператор, поэтому мы можем перейти к оператору return («Vanilluxe проиграет в битве с Дарманитаном»).

Заключение

Условные операторы и операторы сравнения - два мощных инструмента, которые могут помочь проверить условия в наших данных, которые запускают определенные действия. Ознакомьтесь с обоими, так как вы будете часто использовать их с Ruby!