- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
function main() {
for (const q of [1, 12]) {
print(q);
}
for (const l of "HW") {
print(l);
}
print("done.");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
function main() {
for (const q of [1, 12]) {
print(q);
}
for (const l of "HW") {
print(l);
}
print("done.");
}
продолжаем говнокодить компилятор для TypeScript (типа новый сабсет для native-ого кода)
как же они его хранят? Выбирают "удачный размер" (допустим, 8 байт, чтоб указитель влез) и если влазит в него, то прямо и хранят, а так в куче?
А sizeof у него какой? Как у "удачного размера"?
Звучит ведь как какой-то пхпизм прост
Обычно variant'а с конкретными типами хватает ну или интерфейса. Желания хранить в одной коллекции всё что угодно как-то не возникало...
Так этож нужно по ссыкле тогда: не бесплатная абстракция!)
Если не проверил тип и скастовал в неправильный — получи эксепшеном в щи.
но мне всё равно немного неождианного видеть такую высокоуровневую херню в крестах
Лол. Ну в крестах по большей части всё типобезопасно. Динамик каст тоже исключениями кидается если ты его прижал к стенке и заставил кастовать ссылки, а не указатели.
а научи меня получить тип "*a" в рантаймме?
RTTI же значит "рантайм тайп"
Т.е. RTTI есть у всего, но в рантайме оно резольвится только у классов с виртуальной таблицей.
З.Ы. Именно поэтому any берёт typeid до каста в void* и хранит его отдельным полем.
Иными словами информация о типе в рантайме есть только у виртукальных классов, верно?
А теперь -- внимание -- переведем на английский выделенную жирным фразу
Просто для всех типов, где нет виртуальных таблиц, значение typeid очевидно для конпелятора и ему не надо лезть в таблицу. А то что ты там какой-то хуйни reinterpret cast'ом накастовал -- это твои личные проблемы.
А например в питоне, джаве и сишарпе есть всегда
type_info существует для всех типов. Обычно ненужные type_info выкидываются линкером, но для полиморфных классов к которым когда-то применяли typeid их приходится хранить (потому что хрен знает, какой конкретно динамический тип там будет.)
Это же какой-то пиздец)
Ладно, если я буду думать, что как-бы RTTI есть у всего, но потом линкер его просто выкинул, то это будет правильно?
Nope. Если ты взял typeid(int), то теперь в рантайме у тебя существует type_info, описывающее int.
Или для инта я могу только статически на самом деле ее получить, ведь инт не виртуален?
Да глобалка обычная, вроде. Для простых типов typeid() просто раскрывается в ссылку на неё, для более сложных он лезет в таблицу виртуальных методов и достаёт ссылку оттуда (нулевой слот вроде). Вот и вся магия.
Просто это может быть не обязательно.
Ну типа
if (someRandom()) {
typeid(foo).name() // может, и нет смысла его инлайнить
}
RTTI -- это и есть механика, состоящая из typeid() и type_info. И структура type_info есть абсолютно у каждого типа (но ты не платишь за те типы, для которых ты её не берёшь).
За счёт этого ты и можешь проверить, что из std::any достаётся именно тот тип, который туда положили. Или можешь сделать какую-нибудь хешмапу из typeid в обработчик для нужного типа.
То есть если класс не полиморфный, то у меня нет физической возможности потрогать этуструктуру в рантайме, и компилятор её выкидывает как-бы в рамках такой оптимизации?
Как-то так. Ты же её не получаешь документированными способами, а значит и потрогать не можешь.
> RTTI
В С++ это упоминается только в качестве кода для главы в которой описывается type_info и товарищи: support.rtti
std::map<std::string, std::any> globalSettings.
Хотя конечно если я хочу хранить там int, то переголова небольшая
Ну и не надо самому городить касты.
Обычно всё-таки нужно какие-то свои объекты и функции скрипту дать. Иначе скучно ведь.
А интеграция с няшной и песочница у луа самая простая из всей популярной скриптушни, наверное.
Можно например сделать такую таблицу, при обращении к окторой всегда возвращается число 32.
И это позволяет юзать таблицы как универсальный такой интерфейс: функция ожидает нечто, в чем есть поле "foo", а поле может быть настоящим или програмным..
Основая структура проста тем, что она одна: нескалярный тип только таблица.
Она может быть массивом, ассоц массивом, объектом или неймспейсом.
Она имеет декларативный синтаксис, что позволяет описывать декларативно хош массив, хош ассоц массив.
Собссно Lua это наследник языка Sol, как раз для описания конигфруаций и используемого.
Собссно, её и читал спиздив в Интернете
из класса лямбдочку взяли мы домой
сколько на лямбдочке проперти цветных!
розовых уинтов, даблов золотых
С другой -- там есть слово "javascript" (ну тайпскрипт, не важно), а значит он автоматически становится современным, актуальным, популярным, и ассоциируется с успешными стартапами в кремниевой долине
- угу, прямо миф морозная свежесть