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


Фотография

Функция #


Лучший Ответ Totoro , 03 Октябрь 2017 - 16:54

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

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

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 =)).

Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 21

#1 Оффлайн   Stinger

Stinger
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 16:40

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

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

 

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


Сообщение отредактировал Stinger: 03 Октябрь 2017 - 16:57


#2 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 513
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 16:53

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

 

можно так

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

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


  • Stinger это нравится

#3 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 663
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 03 Октябрь 2017 - 16:54   Лучший Ответ

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

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

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: 03 Октябрь 2017 - 16:56

  • Stinger это нравится

#4 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:04

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



#5 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:07

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

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

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


Сообщение отредактировал Alex: 03 Октябрь 2017 - 17:17


#6 Онлайн   NEO

NEO
  • Java
  • Сообщений: 1 669
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 03 Октябрь 2017 - 17:11

 

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

 

https://hastebin.com/ogisidixak.lua


  • Stinger это нравится

#7 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:13

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



#8 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 513
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:15

есть ли возможность написать функцию под символ

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



#9 Онлайн   NEO

NEO
  • Java
  • Сообщений: 1 669
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 03 Октябрь 2017 - 17:16

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

 

https://hastebin.com/idufakifim.lua

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

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

 

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


Сообщение отредактировал NEO: 03 Октябрь 2017 - 17:18

  • Stinger это нравится

#10 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:23

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

 

https://hastebin.com/idufakifim.lua

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

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

 

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

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



#11 Онлайн   NEO

NEO
  • Java
  • Сообщений: 1 669
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 03 Октябрь 2017 - 17:25

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

 

http://prntscr.com/gsrkff

https://hastebin.com/areceruziy.lua


Сообщение отредактировал NEO: 03 Октябрь 2017 - 17:27

  • Stinger это нравится

#12 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 24
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 17:34

Супер, всё работате как часы!



#13 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Администраторы
  • Сообщений: 263
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

         2         

Отправлено 03 Октябрь 2017 - 17:50

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

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



#14 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 513
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 18:25

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

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



#15 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 663
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 03 Октябрь 2017 - 20:11

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

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

 

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

 

 

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



#16 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 513
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 03 Октябрь 2017 - 23:22

Максимально аутентичная функция. =)

 

не совсем :)

 

VP8D3Qc.png

 

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



#17 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 663
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 04 Октябрь 2017 - 12:53

не совсем
 

 

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

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



#18 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 738
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                    

Отправлено 04 Октябрь 2017 - 13:09

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

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


#19 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 513
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 04 Октябрь 2017 - 16:16

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

 

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

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


  • eu_tomat это нравится

#20 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 663
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 04 Октябрь 2017 - 17:09

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

 

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

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

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


  • Alex это нравится

#21 Оффлайн   swg2you

swg2you
  • Пользователи
  • Сообщений: 268
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                 

Отправлено 04 Октябрь 2017 - 17:58

А так
Varname:len
Можно в 5.0?

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

Сообщение отредактировал swg2you: 04 Октябрь 2017 - 18:10


#22 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 943
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                               

Отправлено 05 Октябрь 2017 - 02:47

Как и написано в доках, оператор # возвращает любой элемент, не равный nil, если следующий равен nil. Какой именно вернёт — это уже зависит от положения таблицы в памяти и способа наполнения (например, #{[1]=1, [2]=2, [4]=4, [6]=6} равен 6, а если объявить сначала таблицу, а потом уже заполнить: a[1] = 1, a[2] = 2 и т. д., то #a будет равен 4).

 

Хорошо хоть, что нечисловые элементы не влияют.

 

А решение просто: не юзайте оператор, если не работаете с последовательностями.


  • Alex, Totoro, Doob и еще 1 это нравится




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных