Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

снова про языковые конструкции

64K
20 сентября 2011 года
az20110303
29 / / 13.09.2011
решил создать новую тему, так как в предыдущей всё еще идет бурное обсуждение.

В общем, пришел в голову такой изврат:
Возвращаемое значение функции/метода в современных императивных языках программирования всегда одно. Мне же часто в коде требуется оформить определенным образом результат работы функции, а также некую дополнительную информацию, например код ошибки.
Конечно, существует множество "выходов из положения", но на мой взгляд лучший вариант - позволить функциям возвращать несколько значений.

Например:

 
Код:
int i, enum error = remainder(100500, 600); //остаток от деления целого на целое
if (error==DivisionErrors::NoError) {
  printf("result is %d", i);
}else {
  printf("error happened: %d", error);
}
Страницы:
5
21 сентября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Norgat
Я всё больше склоняюсь к мнению, что вывод типов это не более чем игрушки, кроме случаев типа LINQ, где юзаются автоматически сгенерированные анонимные типы.

Смешно :)

5
21 сентября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Norgat

Реальность показывает, что паттерн-матчинг в реальности нужен редко(а вернее он удобен для небольшого класса задач). Т.к. расширять код основанный на операторе match-with тот ещё геморрой (поменял код объединения - скажи привет ручному переписыванию всех блоков match-with).

Дык, для того он и нужен! Варианты/закрытая иерархия классов суть одного и того же, просто ты наверно знаком лишь с одной реализацией вариант - в F#. В Nemerle никто не запрещает тебе сделать вариантный тип наследованный от известного класса и реализующий интерфейсы, так что свободы в выборе "виртуальный вызов" / "match-диспетчеризация" значительно больше (пример - FixedType)

535
23 сентября 2011 года
Нездешний
537 / / 17.01.2008
[QUOTE=az20110303]int i, enum error = remainder(100500, 600); //остаток от деления целого на целое
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);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог