21 Responses to Было, нет?

  1. Kaeer:

    Это очень круто, есть еще что-то похожее?

  2. Kaeer:

    Я просто коллекционирую всякую такую хуету.

  3. Ppoed:

    Какой-то странный сарказм про a = a.

  4. PeeZlo:

    А в этом есть логика?

  5. XlbZlo:

    если задуматься, то есть

  6. Ppoed:

    Да. Когда интерпретатор встречает выражение вида «valid_local_variable_name = expression» то происходит следующее:

    В текущем контексте проверяется наличие локальной переменной с таким именем.

    — Проверяется наличие локальной переменной в текущем контексте
    — Если переменной в текущем контексте нет, создаётся новая переменная. Переменная ссылается на nil по-умолчанию.
    — Выполняется выражение
    — Переменная начинает ссылаться на объект, который был результатом выполнения выражения

    Это строгое правило позволяет избежать неоднозначности при объявлении локальных переменных и однозначно разделить вызов метода с «=» на конце и присвоение значения локальной переменной.

    Из этого правила вытекает некоторое количество смешных сайд-эффектов. Например приватные методы в принципе нельзя вызвать с явным указанием получателя (object.private_method). Но мы знаем, что мы можем определить методы со знаком равно на конце (псевдо-сеттеры) и ничто не мешает нам определить private_method=. Т.к. интерпретатор всегда будет расценивать выражение private_method = 3, не как вызов метода, а как установку переменной создаётся впечатление что такие приватные методы вызвать невозможно. Но это не так — такие методы можно вызвать, ояебу, указав в виде получателя self.

  7. PeeZlo:

    а потом еще раз задуматься, и … wat?

  8. PeeZlo:

    Клево. Теперь я знаю еще одну фигню которой можно троллить Ауха на тему ущербности Рубей.

  9. Ppoed:

    Пфф, слабая хуйня для троллинга. Лучше троллить тем фактом, что строки длиннее 23 символов в два раза медленнее. Или например вопросом «Кто является суперклассом класса класс?»

  10. Ppoed:

    А если серьёзно, то Мацумото придумал очень удобный способ объявления переменной. Правило очень простое. И исключений из этого правила нет. Есть небольшое исключение из правила про приватные методы, которое в реальной жизни знает менее 1% разработчиков, так как это достаточно плохая идея делать приватные setter методы.

    Кстати, ещё можно потроллить тем фактом, что на самом деле в объектой модели рубей нет такого понятия как аттрибуты/параметры, а есть только объекты, классы, методы и разного рода переменные. А всё остальное тупо соглашения и всякие хаки. Или тем фактом что у символов и чисел нет синглтон-методов, а у всего остального есть. И что суперклассом true будет не Boolean а TrueClass (для false — FalseClass). Ну и так далее 🙂

  11. PeeZlo:

    Спасибо. Записал все в блокнотик «Троллинг и прочие развлечения».

  12. Ppoed:

    У нас там целая блог есть. Приходи туда 😉

  13. PeeZlo:

    Целая блог чтобы троллить Ауха?? Крутотень!

  14. XlbZlo:

    это просто специфика руби такая, иногда даже полезно

  15. Naref:

    Пользователей руби набралось аж на блогу?!!

  16. Ppoed:

    Ты не поверишь!

  17. DArsuper:

    Ну как-бе в великом и могучем тоже есть такое 😀

    $a = $a;
    var_dump($a);

  18. PeeZlo:

    Во-первых, называть ПХП великим и могучим — слишком толсто. Во-вторых, строчка $a=$a в твоем примере никакой роли не играет, в отличие от Рубей.

  19. Etano:

    а чего он говорит, что []+{} — just an object?
    Это же вроде строка «[object Object]», так же ещё смешнее

  20. Aynsuper:

    Так отобажается объект при выводе с toString() (вызывается автоматически). Да и вообще весь WAT про JS это совсем не WAT, глупо смеятся над таким в языках с неявным приведением типов. Все правила приведения типов описаны в спецификации, если их знать, то результат []+{} будет вполне очевидным.

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