1. JavaScript / Говнокод #15969

    +157

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    function test(x) {
        function undefined(x) { throw "Missing in action"; }
        switch (x) {
        case 1: console.log("X reporting for duty!"); break;
        case undefined(x): break;
        }
    }

    Переделка длинного и скучного кода, но смысл остался.

    Запостил: wvxvw, 13 Мая 2014

    Комментарии (6) RSS

    • надо было назвать test1(x)
      Ответить
      • Там смысл был в том, что человек пытался реализовать паттерн-матчинг, но видя как оно не особо получается, забил. Вцелом идея была примерно такая:

        function match(x) {
            function isString(x) { return x + "" === x; }
            function isInt(x) { return x | 0 === x; }
            function isFloat(x) { return x + 0 === x; }
            function unknown(x) { throw "X declines to identify"; }
            
            switch (x) {
            case isString(x): console.log("X is a string"); break;
            case isInt(x): console.log("X is an integer"); break;
            case isFloat(x): console.log("X is a float"); break;
            case unknown(x): break;
            }
        }
        match("foo");
        match(1);
        match(1.1);

        Ну и в духе ж.скрипта, теперь вопрос знатокам: почему иногда функция упадет с ошибкой, а иногда - нет (при том, что ввод один и тот же, и никаких рандомов или побочных эффектов тут вроде не наблюдается, за исключением вывода в консоль, но это не важно.)
        Ответить
        • В жс в ветках свича можно юзать неконстантные выражения? О_о
          Ответить
          • Нельзя использовать только statement, а любые выражения - можно. Т.е. например, throw или var туда нельзя. По-сути, это обычный if-else, все, что можно в нем, можно и в свитче. Единственное различие, что можно задать переход из нескольких веток в одну другую, т.е. fall-through.
            Ответить
        • Как оно вообще работает? Там, наверное, должно быть switch(true)?
          Алсо, надо поставить скобки в isInt: (x | 0) === x, а то без скобок оно парсится как x | (0 === x)
          Ответить
          • Ну в этом же и превосходство сишного синтаксиса перед практически любым другим: можно долго разгадывать, что автор хотел выразить своим кодом. Должно ли было быть значение в свитче true? Совсем не обязательно, наоборот, можно было бы интерпретировать код как попытку сделать что-нибудь такое:
            function match(x) {
                function isString(x) { return x + ""; }
                function isInt(x) { return x | 0; }
                function isFloat(x) { return x + 0; }
                function unknown(x) { throw "X declines to identify"; }
                
                switch (x) {
                case isString(x): console.log("X is a string"); break;
                case isInt(x): console.log("X is an integer"); break;
                case isFloat(x): console.log("X is a float"); break;
                case unknown(x): break;
                }
            }
            Ответить

    Добавить комментарий