Почему нельзя передать хеш-литерал методу: p {} ?

Фигурные скобки "{}" распознается как блок, а не как конструктор класса Hash. Можно заставить распознавать "{}" как выражение, указав явно, что это параметр: p({}).

Вход для пользователей