int i, enum error = remainder(100500, 600); //остаток от деления целого на целое
if (error==DivisionErrors::NoError) {
printf("result is %d", i);
}else {
printf("error happened: %d", error);
}
снова про языковые конструкции
В общем, пришел в голову такой изврат:
Возвращаемое значение функции/метода в современных императивных языках программирования всегда одно. Мне же часто в коде требуется оформить определенным образом результат работы функции, а также некую дополнительную информацию, например код ошибки.
Конечно, существует множество "выходов из положения", но на мой взгляд лучший вариант - позволить функциям возвращать несколько значений.
Например:
Код:
Цитата: Norgat
Я всё больше склоняюсь к мнению, что вывод типов это не более чем игрушки, кроме случаев типа LINQ, где юзаются автоматически сгенерированные анонимные типы.
Смешно :)
Цитата: Norgat
Реальность показывает, что паттерн-матчинг в реальности нужен редко(а вернее он удобен для небольшого класса задач). Т.к. расширять код основанный на операторе match-with тот ещё геморрой (поменял код объединения - скажи привет ручному переписыванию всех блоков match-with).
Дык, для того он и нужен! Варианты/закрытая иерархия классов суть одного и того же, просто ты наверно знаком лишь с одной реализацией вариант - в F#. В Nemerle никто не запрещает тебе сделать вариантный тип наследованный от известного класса и реализующий интерфейсы, так что свободы в выборе "виртуальный вызов" / "match-диспетчеризация" значительно больше (пример - FixedType)
if (error==DivisionErrors::NoError) {
printf("result is %d", i);
}else {
printf("error happened: %d", error);
}[/QUOTE]Имхо, надуманная какая-то проблема. Можно вернуть std:: pair<int, error_type>, если очень уж хочется. Или использовать out параметр.
Код:
error_type remainder(int, int, int& out_value);
int i;
error_type error = remainder(100500, 600, i);
int i;
error_type error = remainder(100500, 600, i);