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

Функция #

Вопрос

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

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

 

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

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

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


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

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

  • 0

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

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

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

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


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

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

 

можно так

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

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

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


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

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

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


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

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

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

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

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

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


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

 

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

 

https://hastebin.com/ogisidixak.lua

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


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

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

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


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

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

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


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

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

 

https://hastebin.com/idufakifim.lua

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

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

 

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

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

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


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

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

 

https://hastebin.com/idufakifim.lua

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

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

 

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

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

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


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

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

 

http://prntscr.com/gsrkff

https://hastebin.com/areceruziy.lua

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

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


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

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

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

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


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

 

 

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

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

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


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

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

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

 

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

 

 

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

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

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


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

 

не совсем :)

 

VP8D3Qc.png

 

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

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


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

 

 

не совсем
 

 

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

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

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


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

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

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

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

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


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

 

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

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:  :)

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


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

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

 

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

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

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

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


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

А так

Varname:len

Можно в 5.0?

 

Upd:

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

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

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


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

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

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

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

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

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

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

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

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


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