Перейти к содержимому
  • 0
Stinger

Функция #

Вопрос

Здравствуйте друзья, проблема следующая в моей версии lua 5.0 напроч отсутствует функция #, можно ли как то заменить её ?

Очень нужна, обновить lua невозможно зашито в exe файл, буду признателен за вашу помощь.

 

Вот ошибка: unexpected symbol near '#' , неизвестный символ говорит.

Изменено пользователем Stinger

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Можно набросать свою.

Если надо именно по индексам считать, как делает стандартная функция:

local a = {"a", "b", "c"}

function size(t)
  local index = 0
  while true do
    if t[index+1] then index = index + 1
    else return index end
  end
end

print(size(a))

А для длины строк можно string.len(str) юзать.

 

(Для русских строк - стырить функцию из модуля unicode =)).

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что нужно именно получить? Длину строки? 

 

можно так

str = 'aabbcc'
print(str:len())

или для чего она еще нужна именно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ, ваше решение достаточно хорошее но везде использовать функцию вместо символа не очень согласитесь, есть ли возможность написать функцию под символ ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Допустим у меня длинная функция и вместо того что бы везде подставить #a #b #c #d я буду вынужден подставлять size(a) size(b) size© size(d), есть ли какое то более оптимальное решение ?

Или для данной версии это максимум, чего можно достигнуть ?

Так же большое спасибо за быстрый ответ.

Изменено пользователем Alex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Допустим у меня длинная функция и вместо того что бы везде подставить #a #b #c #d я буду вынужден подставлять size(a) size(b) size© size(d), есть ли какое то более оптимальное решение ?

 

https://hastebin.com/ogisidixak.lua

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Большое спасибо, думаю можно закрывать тему, всем спасибо за помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
есть ли возможность написать функцию под символ

вряд ли)  вызов функции уже в себя должен вмещать имя и кавычки. То что в новых версиях луа есть в синтаксисе # , так это реализовано, видимо, на уровне самого языка, и парсер, судя по всему, знает, что это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Или так можно.

 

https://hastebin.com/idufakifim.lua

Код не проверял.

Можно сразу передать функции много переменных и она на выходе выдаст размеры их.

 

local s1, s2, s3 = size(arr1, arr2, "hello world")

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Или так можно.

 

https://hastebin.com/idufakifim.lua

Код не проверял.

Можно сразу передать функции много переменных и она на выходе выдаст размеры их.

 

local s1, s2, s3 = size(arr1, arr2, "hello world")

Спасибо, попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поправил и добавил функцию от Тоторы.

 

http://prntscr.com/gsrkff

https://hastebin.com/areceruziy.lua

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На сколько я помню в луа таблицах есть такой прикол

{1, 2, 3, nil, nil, nil, 7} покажет размер 3, так что выше описанные примеры могут не работать, есть вариант использовать через for in pairs()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

так что выше описанные примеры могут не работать

ну так то да, size_table будет считать элементы до первой "дырки"  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На сколько я помню в луа таблицах есть такой прикол

{1, 2, 3, nil, nil, nil, 7} покажет размер 3, так что выше описанные примеры могут не работать, есть вариант использовать через for in pairs()

 

У меня вроде и считает до первой "дырки". Максимально аутентичная функция. =)

 

 

Насчёт определить функцию в виде символа. В Луа это делается через метатаблицы. Но загвоздка в том, что переопределить можно поведение только тех операторов, которые знает язык. А оператор решётки ввели в Lua 5.2+.

Так что придётся довольствоваться обычной функцией size.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Максимально аутентичная функция. =)

 

не совсем :)

 

VP8D3Qc.png

 

Длиной таблицы t считается любой целый индекс n такой, что t[n] не равен nil, а t[n+1] равно nil. Кроме того, если t[1] равен nil, то #t = 0. Для регулярных массивов от 1 до n, не содержащих значений nil,  длиной является n, то есть индекс последнего значения. Если в массиве присутствуют "дыры" (т.е., значения nil между ненулевыми значениями), то значением #t является индекс элемента, непосредственно предшествующего элементу nil (поэтому любое значение nil по сути означает конец массива).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

не совсем
 

 

Что за дьявольская магия? =)

Написано же - "любое значение nil по сути означает конец массива" но твой пример кода этому противоречит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что за дьявольская магия? =)

Написано же - "любое значение nil по сути означает конец массива" но твой пример кода этому противоречит.

Меня тоже удивила такая логика. Но всё-таки формулировка "любое значение nil" не подразумевает "с минимальным индексом".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Что за дьявольская магия? =)

 

это еще бубочки, можно сказать, цветочки даже, а вот ягодки:

t1={1,2,3} -->3
t2={nil} -->0
--окай, вроде все норм

t3={1,2,nil,4} -->4
t4={nil,nil,nil,nil,nil,nil,nil,8} -->8
t5={nil,nil,nil,nil,5,6,7,nil,nil,10} -->10
--хм, вроде как выходит, что если последний элемент не равен nil,
--то его значение индекса и будет являться длиной массива(но не факт)

t6={1, 2, 3, nil, nil, 6, nil} -->3
--длина уже до первой дырки, один nil в конце массива, НО

--вот сейчас начинается дьявольская магия, дичь и взрыв мозга
t7={1,2,nil,4,nil} -->2 окай, до первой дырки видимо, считает
t8={1, 2, nil, 4, nil, nil, nil, nil} -->4   ПОЧЕМУУУ?????))) Если больше одного нила, то ВСЕ нилы откусывает вообще с конца????

print('1:',#t1)
print('2:',#t2)
print('3:',#t3)
print('4:',#t4)
print('5:',#t5)
print('6:',#t6)
print('7:',#t7)
print('8:',#t8) 
1:	3
2:	0
3:	4
4:	8
5:	10
6:	3
7:	2
8:	4 

не понял логики... почему так происходит?   :smile14:  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Загадочный Луа.

 

Кстати, по теме. В старых версиях Lua существовала своя альтернатива хеш-оператору:

print(table.getn{10,2,4})

Как раз в Lua 5.0 должна работать по идее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А так

Varname:len

Можно в 5.0?

 

Upd:

Я б всеже попробовал повесить на таблицу и строку метаметод. Какуйто унарную операцию которая не имеет смысла для этих типов.

Изменено пользователем swg2you

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...