LINUX.ORG.RU
ФорумTalks

Case со строками

 ,


0

3

Пишу сейчас программу методом копипаста, и при вставке очередного сравнения строк возник вопрос: а есть ли языки, где можно сравнивать строки оператором CASE? Как-то так:

case string of
"qwerty": { printf("Слабый пароль.\n"); }
"абырвалг", "главрыба": { printf("Борменталь.\n"); }
"linux.org.ru", "opensource.ru": { printf("Рулез.\n"); }
else { printf("Ну и запросы у вас.\n"); }

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

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

В жабе обещали запилить.

aleks13
()

GML, буду оригинален.

Deleted
()

В тех языках, где есть тип 'string' и на нём определена операция сравнения.

switch string {
  case 'qwerty':
    break;
  default:
    break;
}

Bad_ptr ★★★★★
()

haskell. Через case можно сравнивать, все что можно посчитать одинаковым.

case string of
    "qwerty" -> putStrLn "hello, qwerty" 
    "dvorak" -> putStrLn "hello, dvorak"

zinfandel ★★
()
Ответ на: комментарий от redgremlin
use feature qw(say switch);

given($string) {
  when(/^qwerty$/): { say 'Слабый пароль'; }
  when(/^абырвалг$/ or /^главрыба$/): say 'Борменталь.'; }
  when(/.ru$/): { say 'Deprecated since Great Russian Firewall.'; }
  default { say 'Ну и запросы у вас.'; }
}
redgremlin ★★★★★
()

C


#include <stdio.h>

enum eChoice {
  cQwerty
  ,cStuff
  ,cLOR
  ,cElse
};

struct sChoice {
  char * Variant;
  enum eChoice Code;
} Variants[] = {
   { "qwerty", cQwerty }
  ,{ "абырвалг", cStuff }
  ,{ "главрыба", cStuff }
  ,{ "linux.org.ru", cLOR }
  ,{ "opensource.ru", cLOR }
  ,{ "", cElse }
};

enum eChoice strtocase(char *srcstr) {
        enum eChoice result = cElse;
  int idx = 0;
  while (result == cElse && Variants[idx].Code != cElse) {
    if (!strcmp(srcstr, Variants[idx])) {
      result = Variants[idx].Code;
    }
  }
  return result;
}

int main() {
  char * test = "qwerty";
  switch(strtocase(test)) {
    case cQwerty: printf("Слабый пароль.\n"); break;
    case cStuff: printf("Борменталь.\n"); break;
    case cLOR: printf("Рулез.\n"); break;
    default: printf("Ну и запросы у вас.\n");
  }
}


ziemin ★★
()

Как-то так:

Да это же почти паскаль:

var
 
SSSS: ansistring;

begin

SSSS:='главрыба';

case SSSS of
'qwerty': Writeln('Слабый пароль.'); 
'абырвалг','главрыба': Writeln('Борменталь.');
'linux.org.ru','opensource.ru': Writeln('Рулез.');
else Writeln('Ну и запросы у вас.');
end;

end.
Компиляция: fpc -XX -XM file.pp

Napilnik ★★★★★
()
Ответ на: комментарий от x3al

Хотя насчёт forth не уверен: в нём можно в том числе и это, если определиться, что такое «строка».

x3al ★★★★★
()

Хоть бы кто ссылку кинул, в чем отличие case от if :) И почему если if можно сравнивать, а case нет. Ну или я не так понял ТС.

Ubuntu1210
()
Последнее исправление: Ubuntu1210 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Потому что это не язык, а недоразумение :3

Зато там в case можно даже регэкспы пихать. А вашему языку слабо?

AX ★★★★★
()

C++. Макросы, где возможно шаблоны

nerdogeek
()

ты так собираешься проверять «слабость пароля»?

По мне так, самое выдающееся сравнение по CASE в эрланге и остальных язычках, реализующих как в эрланге :)

Но занятно посмотреть на ассемблерный код участка где CASE.

swwwfactory ★★
()

elif в python.

Хоть более громоздко, чем case, но зато является расширением конструкции if-else, а не независимым инструментом.

Ttt ☆☆☆☆☆
()
Последнее исправление: Ttt (всего исправлений: 1)

а есть ли языки, где можно сравнивать строки оператором CASEа есть ли языки, где можно сравнивать строки оператором CASE

В сибирскую глубинку интернет привозят на дисках.

shahid ★★★★★
()
Ответ на: комментарий от Ttt

но зато является расширением конструкции if-else, а не независимым инструментом

И в чём тут плюс? case на уровне синтаксиса гарантирует, что сравниваемый объект един для всех проверок, тогда как при elif возможна ситуация if (var1 == val1 ) {} elif (var2 == val2), а для реализации case get_and_change_some_value на elif'ах надо вводить временную переменную.

redgremlin ★★★★★
()

буду не популярен: case ненужен. if elif.

x0r ★★★★★
()
Ответ на: комментарий от Ttt

elif ущербен же.

зато:

{
 'qwerty': lambda: 'слабый пароль',
 'абырвалг': lambda: 'Борменталь',
 'linux.org.ru': lambda: 'рулез',
}. get('linux.org.ru', lambda: 'Ну и запросы у вас')()

это быстрый хак, придумал вот на месте. уверен, можно красивее.

val-amart ★★★★★
()

Даже в баше есть.

Deleted
()
Ответ на: комментарий от val-amart

elif ущербен же.

Ну, есть ещё случай, когда нужно проматчить не просто строку, и даже не регулярку, а выхлоп от sed например. Хотя это редко бывает, да.

Deleted
()
Последнее исправление: fargred (всего исправлений: 1)
Ответ на: комментарий от redgremlin

То, что хочет ТС ('строка1' OR 'строка2'), я бы сделал анонимными массивами, а не строками:

$ perl -M5.014 -E'for("абыв"){say 1 when [qw/124 567/]; say 2 when ["абыв", "абыр"];}'
2

Впрочем, возможность бесплатно использовать regexp'ы в switch - это отличная добавка.

AITap ★★★★★
()
Последнее исправление: AITap (всего исправлений: 1)
Ответ на: комментарий от next_time

Танцы с бубном вокруг _препроцессора_ и ручная пляска с циклом вокруг заранее подготовленного массива — это не «умеют». Потому, что проще (не говоря о поддерживаемости) банально написать if'ы.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.