Могу ли я использовать `else if` вместо` elsif`?

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

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

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

41
задан sawa 6 August 2015 в 15:44
поделиться

1 ответ

TL; DR - Замена elsif на else if подходит для условного задания только с 2 путями. Не забудьте закрыть второе if условие, созданное с помощью else if. Лучше всего иметь как можно меньше условных уровней, что делает метод менее сложным. Поэтому соблюдайте осторожность и используйте elsif.

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

Возьмите следующий пример. Есть только 2 условия. Второе условие выглядит как elsif, но интерпретируется как второй фрагмент кода:

# What you may want to write
if true
  puts 'true'
else if false
  puts 'false'
end

# How Ruby requires it
if true
  puts 'true'
else
  if false  # You may also do: puts 'false' if false
    puts 'false'
  end
end

Первый блок будет искать другой end, чтобы закрыть основное условие. Обратите внимание, вы можете обойти дополнительный конец с помощью одной строки if. (Я предлагаю это только в том случае, если исполняемый код может быть записан в одну строку.)

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

Вот когда вы не хотите реализовывать else if:

def describe(inhabitant)
  if inhabitant == "sophie"
    puts 'gender: female'
    puts 'height: 145'
  elsif inhabitant == "paul"
    puts 'gender: male'
    puts 'height: 145'
  elsif inhabitant == "dawn"
    puts 'gender: female'
    puts 'height: 170'
  elsif inhabitant == "brian"
    puts 'gender: male'
    puts 'height: 180'
  else
    puts 'species: Trachemys scripta elegans'
    puts 'height: 6'
  end
end

Обратите внимание, что ни одно из выражений elsif не может быть «преобразовано» в else if чистым способом.

ОБНОВЛЕНИЕ : Благодаря Стефану вы все еще можете использовать else if, что приводит к очень вложенному методу.

https://gist.github.com/sos4nt/a41b36d21f6eec5e0a42

16
ответ дан Community 6 August 2015 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: