В чем разница между Кондом и Кейсом?

В языке программирования Elixir, существует две аналогичные конструкции cond и case. Оба они напоминают операторы switch или select из других языков

оба cond и case описаны на этой странице

Ответы

Ответ 1

Позвольте мне поместить if в клуб. Вы используете if с одним условием и возможным else, чтобы оно было. Вы используете оператор cond, когда у вас более одного условия, а оператора if недостаточно, к концу, оператор case используется, когда вы хотите, чтобы шаблон соответствовал некоторым данным.

Объясните примерами: предположите, что вы хотите есть яблоко, если сегодня идет дождь или рис, если нет, тогда вы можете использовать:

if weather == :raining do
  IO.puts "I'm eating apple"
else
  IO.puts "I'm eating rice"
end

Это ограниченный мир, поэтому вы хотите расширить свои параметры, и из-за этого вы будете есть разные вещи на некоторых условиях, поэтому оператор cond для этого:

cond do
  weather == :raining and not is_weekend ->
    IO.puts "I'm eating apple"
  weather == :raining and is_weekend ->
    IO.puts "I'm will eat 2 apples!"
  weather == :sunny ->
    IO.puts "I'm happy!"
  weather != :raining and is_sunday ->
    IO.puts "I'm eating rice"
  true ->
    IO.puts "I don't know what I'll eat"
end

Последний true должен быть там, иначе он вызовет исключение.

Ну так что насчет case? Он используется, чтобы сопоставить что-то. Предположим, что вы получаете информацию о погоде и дне недели в качестве сообщения в кортеже, и вы зависите от этого, чтобы принять решение, вы могли бы написать свои намерения как:

case { weather, weekday } do
  { :raining, :weekend } ->
    IO.puts "I'm will eat 2 apples!"

  { :raining, _ } ->
    IO.puts "I'm eating apple"

  { :sunny, _ } ->
    IO.puts "I'm happy!"

  { _, :sunday } ->
    IO.puts "I'm eating rice"

  { _, _ } ->
    IO.puts "I don't know what I'll eat"
end

Итак, case предлагает вам подход к сопоставлению шаблонов с данными, которые у вас отсутствуют с if или cond.

Ответ 2

Мой простой ответ:

  • cond не получает никаких аргументов и позволяет использовать в каждой ветки другое условие.
  • case получает аргумент, и каждая ветвь сопоставляется с шаблоном против аргумента.