Перейти к контенту

Язык Lua. Общие вопросы программирования


Malandrinus

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

Что означает сей pattern? Где прочитать про составление pattern'ов(читал printf в C языках на википедии...не особо там понятно, или я тупой)

 

 "^%s*(.-)%s*$"

 

И что такое найденное вхождение?

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

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


Ссылка на сообщение
чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках?

 

А...невнимательность, действительно - нашел, почитаю. Почитал(бегло) не нашел описания значения символов(*.$) Выяснил, что ^ означает что поиск начинаем с начала строки.

 

Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-)

 

Действительно...забыл погуглить :)

 

Твой патерн вероятно означает (хотя зависит от метода к которому применяется):

 

(string.gsub(str, "^%s*(.-)%s*$", "%1"))

 

Вот мой код собственно...и из паттерна мне понятно только ^%s - эта часть.(Начинаем поиск с начала строки)

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

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


Ссылка на сообщение

Artos, ответил бы...да флуд разжигать не хочется, код писал кстати не я, мне просто дали функцию и я хотел бы разобраться в ней.

 

да еще для gsub

 

Почему "да еще"...а какие паттерны для него НЕбредовые?

 

function trim(str)
    return (string.gsub(str, "^%s*(.-)%s*$", "%1"))
end
       
function explode(str, sep)    
    local pos, t = 1, {}
    if #sep == 0 or #str == 0 then return end
    for s, e in function() return string.find(str, sep, pos) end do
     table.insert(t, trim(string.sub(str, pos, s-1)))
     pos = e+1
    end
    table.insert(t, trim(string.sub(str, pos)))
    return t
end

 

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


Ссылка на сообщение

Artos, но ведь в сталкере(ТЧ по крайней мере) и есть тот самый устаревший функционал(касаемо устаревших полей в table есть foreach, foreachi и setn..да и getn я бы уже приписал), так что почему бы и не поковырять эти методы, и не дойти самому до ответа на вопрос "почему их вырезали".

 

По сути не стоит вопрос узнать "почему их вырезали" (к слову они и не вырезаны, во всяком случае lua 5.1 прекрасно оперирует этими функция). А так походу всё и правда начинается попахивать флудом. Кидая в тему лишь догадки - ничего хорошего в итоге не получается.

Считаю, что Shredder, да и не только он, решили для себя использовать или нет "устаревший" функционал языка. Для меня тема исчерпана. Пока что...

ColR_iT

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

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


Ссылка на сообщение

@AndreySol, вот накидал тебе для наглядности:

 

 

 

t = os.clock()
value = nil

if value == nil then
	print("true")
else
	print("false")
end
print('var1', os.clock() - t)

if not value then
	print("true")
else
	print("false")
end
print('var2', os.clock() - t)

 

Возвращает:

 

 

true
var1	0
true
var2	0

 

И:

 

 

t = os.clock()
value = false

if value == nil then
print("true")
else
print("false")
end
print('var1', os.clock() - t)

if not value then
print("true")
else
print("false")
end
print('var2', os.clock() - t)

 

Возвращает:

 

 

false
var1 0
true
var2 0

 

 

Неужели так трудно самому? У меня минута ушла. (Скрытый посыл: false ~= nil :))

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

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


Ссылка на сообщение

@Desertir, я же написал для наглядности, пусть и время будет, разумеется что оно -> 0, но тем не менее возможно автору вопроса и на это нужен был ответ. 
 

В конкретном случае при value = nil условия проходят одинаково.


Не понял. Ты хочешь еще другие случаи расписать? Удачи :)

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


Ссылка на сообщение

Подскажите более органичное решение следующей задачи: у меня есть 10 чисел (от 1 до 10 например), мне нужно рандомно получить 5 из них, причем так, что-бы ни одно не повторилось. Мне ничего изящнее в голову не пришло:

local t,i,r = {},1,math.random
while i<6 do
local r = r(10)
if not t[r] then t[r] = true; i=i+1 end
end
@Dennis_Chikin, лишние телодвижения с созданием индексированного массива чисел для выбора мне не нужны. Конкретно есть диапазон, и конкретно-же мне нужно выбрать из него n-ое количество неповторяющихся чисел. И у тебя код неверно будет работать:

 

local t = { ... } --// допустим тут 1 ... 10
local n = #t --// тут 10
local tt = {]
local r
for i = 1,5 do
if n < 1 then break end
r = math.random( n ) --// вот тут и есть ошибка, можем выбрать повторяющееся значение, ты удаляешь значение, а рандом идет по индексу, можешь сам проверить 
tt[i] = t[r]
table.remove( t, r )
n = n - 1
end
Так что твой вариант точно не катит. Изменено пользователем Struck

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


Ссылка на сообщение

Кхм, ну и в общем виде моя функция будет выглядеть как-то вот так. Если есть варианты лучше - предлагайте, только проверяйте на всякий случай их перед отправкой  ;)

 

get_numbers = function(...)
local t,i,r,c,m,n,list = {},0,math.random,...
while i<c do
local r = tonumber(n) and r(m,n) or r(m)
if not t[r] then t[r] = true; i=i+1 end
end
if list then local tt = {} for k,_ in next,t do table.insert(tt,k) end return tt 
else  return t
end
end
Изменено пользователем Kirgudu

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


Ссылка на сообщение

@Dennis_Chikin, переиндексирование и так есть, очевидно же. table.remove удаляет значение со сдвигом, значение может удалится по середине, а индекс по-любому с конца.

"ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

Порой я твой сарказм не понимаю.

 

"Дырок" там конечно же нет, это тоже очевидно. Вот тебе нагляднейший пример:

 

 

t={}
for i=1,10 do
table.insert(t,i)
end
print("ONE:")
for k,v in pairs(t) do
print(k.."="..v)
end
table.remove(t,t[6])
print("TWO:")
for k,v in pairs(t) do
print(k.."="..v)
end
На выходе:

 

 

ONE:
1=1
2=2
3=3
4=4
5=5
6=6
7=7
8=8
9=9
10=10
TWO:
1=1
2=2
3=3
4=4
5=5
6=7
7=8
8=9
9=10

 

 

Переиндексация идет, а значит твой код косячит именно там где я и указал выше, сейчас лишь только доказал это эмпирически ;)

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

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


Ссылка на сообщение

@Nazgool, именно то, что я хотел сделать, но не сообразил как, спасибо. Только в функции t на tab надобно поменять.

@Dennis_Chikin, извини, тупанул.

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


Ссылка на сообщение

@RayTwitty, обычный синтаксический сахар не покатит?

local function call_string(obj, method, ...) return obj[method](obj, ...) end

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


Ссылка на сообщение

@RayTwitty, пробуй:
 

function my_pairs (t)
local a = {}
for n in pairs(t) do a[#a + 1] = n end
table.sort(a)
local i = 0
return function()
i = i + 1
return a[i], t[a[i]]
end
end

local ex = {["b"] = 1, ["e"] = 2, ["c"] = 3}

for name in my_pairs(ex) do
print(name)
end

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...