Я портирую библиотеку JavaScript на Ruby и натолкнулся на следующее безумие (сильно сокращенное):
function foo(){
if (foo) ...
loop:
while(go()){
if (...) break;
switch(...){
case a:
break loop;
case b:
case c:
if (...) break loop;
...
break;
case d:
if (...) break loop;
// fall through
case e:
if (...) break loop;
...
break;
case f:
if (...) break loop;
object_init:
do{
switch(...){
case a:
...
break;
case b:
...
break object_init;
}
} while(...);
...
break;
}
}
}
(Вы можете просмотреть весь ужас в строках 701-1006 .)
Как бы вы переписали это в Ruby?В частности:
- Обработка смешанных
break
и break loop
и - Обработка случайных «провалов», возникающих в коммутаторе
Предположительно, хорошая общая стратегия для них поможет мне пройти через другие ситуации, например, вложенный object_init
разрыв, который также происходит.
Edit : Как глупо с моей стороны;JavaScript «проваливается» следующим образом:
switch(xxx){
case a:
aaa;
case b:
bbb;
break;
}
может быть легко переписан в Ruby как:
case xxx
when a, b
if a===xxx
aaa
end
bbb
end