История изменений
Исправление Egor_, (текущая версия) :
~= вместо != (ну нахера?!);
мысля у автора была что ~ это NOT, поэтому ~= это не равно
в луа 5.3 добавился оператор ~ побитовый NOT
как видишь, всё логично
индексы с 1 (бог им судья);
где-то видел упоминание одного забавного холивара «паскаль против си»
сторонник си перечислил недостатки паскаля, составив список типа такого:
- индексы символов в строках начинаются с 1, а не с 0
- ещё что-то
- ещё что-то
ему в ответ сторонник паскаля сказал, а почему ты считаешь паскалевскую нумерацию индексов с 1 недостатком, если сам составил список, занумерованный с единицы вопреки якобы более удобной нумерации с нуля?
сишник не нашёл что ответить )))
в луа индексы начинаются с единицы, потому что во всех стандартных функциях в луа, где принимаются индексы, индексы можно считать как вперёд с начала (1,2,3), так и назад с конца (-1,-2,-3). Если бы индексы начинались с нуля, то фича не получилась бы такая красивая и симметричная.
единственная структура, которая у нормальных людей называется Map, здесь почему-то называется таблицей;
таблица в луа - это одновременно и map, и array, и struct.
я б назвал такую структуру данных «монстроконтейнер», но автор луа выбрал более банальное и неудачное имя.
хорошо или плохо что 0 приводится к true – вопрос философский, в целом удобно, но точно необщепринято;
ну, в сишечке 0 приводится в false потому что язык со строгой типизацией, и там переменная типа int может хранить только числа и не может хранить null/undefined.
а в луа можно хранить в любой переменной nil (значение, выражающее факт отсутствия значения), поэтому 0 - это присутствующее значение, поэтому true.
nil – с одной стороны вроде бы и хорош, с другой – используется как маркер конца массива даже если после него есть значения; в т.ч. массива параметров arg, что дико неудобно. Вот что мешало поле length из коробки сделать?
ты ж сам только что сказал, что в луа таблица - это map
какой нахрен length у map?
length бывает только у массивов
nil - это отсутствие значения, так откуда nil возьмётся в массиве, например, чисел?
ты хочешь чего-то очень странного (массив чисел с дырами)?
у сишников такого типа данных нет, и ничего, живут как-то
но в луа это можно сделать: хочешь хранить длину - храни в поле .n, не хочешь хранить длину - не храни, выбор за тобой, ничего «из коробки» здесь не нужно
если ты передаёшь аргументы в функцию, включая nil, и хочешь узнать их количество, то для этого есть select(‘#’,…)
нет оператора continue; здравствуй куча вложенных if-ов.
continue можно сделать через break на промежуточный фиктивный однократно-выполняемый цикл:
for ... do -- твой цикл
repeat
....
break -- это твой continue
....
break -- это твой continue
....
until true
end
битовые операции завезли только в 5.3 (бакпортнули либой в 5.2); не смотрел, но видимо как и в js они должны быть на младших 32 битах, т.к. в lua все числа – double
в 5.3 завезли int64, и битовые операции - 64-битные
в 5.2 числа только double, и поэтому битовые операции 32-битные
вместо x?y:z есть x and y or z, причём здесь nil от false неотличимы, т.е. эквивалент x?nil:z тут не написать (можно впрочем написать эквивалент not x ? z : nil). Некритично, но эдакое напоминание – «не забывай на чём пишешь»
не ленись, пиши через if - производительность будет точно такая же
«Could be an int, a string, a list», an object, a class, a method…
какой ты странный
так это ж именно ты кладёшь значения в переменную
если ты кладёшь в переменную n только числа, то там и будет число
а если ты кладёшь в переменную значения разных типов, то ты делаешь это специально, реализуя таким способом полиморфизм, и это кстати очень удобно
Разве что if уже две недели на автомате закрываю fi вместо end, #$%ный баш.
у меня проблема с if-ами при переключении между паскалем и луа
никак не привыкну, что там if-end, а там if-begin-end
Исходная версия Egor_, :
~= вместо != (ну нахера?!);
мысля у автора была что ~ это NOT, поэтому ~= это не равно
в луа 5.3 добавился оператор ~ побитовый NOT
как видишь, всё логично
индексы с 1 (бог им судья);
где-то видел упоминание одного забавного холивара «паскаль против си»
сторонник си перечислил недостатки паскаля, составив список типа такого:
- индексы символов в строках начинаются с 1, а не с 0
- ещё что-то
- ещё что-то
Разве что if уже две недели на автомате закрываю fi вместо end, #$%ный баш.
у меня проблема с if-ами при переключении между паскалем и луа
никак не привыкну, что там if-end, а там if-begin-end
ему в ответ сторонник паскаля сказал, а почему ты считаешь паскалевскую нумерацию индексов с 1 недостатком, если сам составил список, занумерованный с единицы вопреки якобы более удобной нумерации с нуля?
сишник не нашёл что ответить )))
в луа индексы начинаются с единицы, потому что во всех стандартных функциях в луа, где принимаются индексы, индексы можно считать как вперёд с начала (1,2,3), так и назад с конца (-1,-2,-3). Если бы индексы начинались с нуля, то фича не получилась бы такая красивая и симметричная.
единственная структура, которая у нормальных людей называется Map, здесь почему-то называется таблицей;
таблица в луа - это одновременно и map, и array, и struct.
я б назвал такую структуру данных «монстроконтейнер», но автор луа выбрал более банальное и неудачное имя.
хорошо или плохо что 0 приводится к true – вопрос философский, в целом удобно, но точно необщепринято;
ну, в сишечке 0 приводится в false потому что язык со строгой типизацией, и там переменная типа int может хранить только числа и не может хранить null/undefined.
а в луа можно хранить в любой переменной nil (значение, выражающее факт отсутствия значения), поэтому 0 - это присутствующее значение, поэтому true.
nil – с одной стороны вроде бы и хорош, с другой – используется как маркер конца массива даже если после него есть значения; в т.ч. массива параметров arg, что дико неудобно. Вот что мешало поле length из коробки сделать?
ты ж сам только что сказал, что в луа таблица - это map
какой нахрен length у map?
length бывает только у массивов
nil - это отсутствие значения, так откуда nil возьмётся в массиве, например, чисел?
ты хочешь чего-то очень странного (массив чисел с дырами)?
у сишников такого типа данных нет, и ничего, живут как-то
но в луа это можно сделать: хочешь хранить длину - храни в поле .n, не хочешь хранить длину - не храни, выбор за тобой, ничего «из коробки» здесь не нужно
если ты передаёшь аргументы в функцию, включая nil, и хочешь узнать их количество, то для этого есть select(‘#’,…)
нет оператора continue; здравствуй куча вложенных if-ов.
continue можно сделать через break на промежуточный фиктивный однократно-выполняемый цикл:
for ... do -- твой цикл
repeat
....
break -- это твой continue
....
break -- это твой continue
....
until true
end
битовые операции завезли только в 5.3 (бакпортнули либой в 5.2); не смотрел, но видимо как и в js они должны быть на младших 32 битах, т.к. в lua все числа – double
в 5.3 завезли int64, и битовые операции - 64-битные
в 5.2 числа только double, и поэтому битовые операции 32-битные
вместо x?y:z есть x and y or z, причём здесь nil от false неотличимы, т.е. эквивалент x?nil:z тут не написать (можно впрочем написать эквивалент not x ? z : nil). Некритично, но эдакое напоминание – «не забывай на чём пишешь»
не ленись, пиши через if - производительность будет точно такая же
«Could be an int, a string, a list», an object, a class, a method…
какой ты странный
так это ж именно ты кладёшь значения в переменную
если ты кладёшь в переменную n только числа, то там и будет число
а если ты кладёшь в переменную значения разных типов, то ты делаешь это специально, реализуя таким способом полиморфизм, и это кстати очень удобно