Подражая поведению javascript `this` в lua - PullRequest
4 голосов
/ 24 мая 2011

Мне всегда нравилось, что в Javascript вы можете установить значение указателя this, выполнив f.call(newThisPtrValue).Я написал что-то для этого в lua, и это работает:

_G.call = function(f, self, ...)
    local env = getfenv(f)
    setfenv(f, setmetatable({self = self}, {__index = env}))
    local result = {f(...)}
    setfenv(f, env)
    return unpack(result)
end

Есть пара вещей, в которых я не уверен:

  1. Я ожидаю, что производительность снизится1008 *.Есть ли способ обойти это?
  2. Может ли это каким-либо образом ужасно нарушить среду функции?
  3. Это действительно плохая идея ™?

1 Ответ

6 голосов
/ 24 мая 2011

Одним из замечательных преимуществ псевдо-ООП Lua является то, что это уже очень легко сделать:

local Person = {}
function Person:create( firstName, lastName )
  local person = { firstName=firstName, lastName=lastName }
  setmetatable(person,{__index=self})
  return person
end
function Person:getFullName()
  return self.firstName .. " " .. self.lastName
end
local me  = Person:create( "Gavin", "Kistner" )
local you = Person:create( "Eric", "Someone" )
print( me:getFullName() )
--> "Gavin Kistner"
print( me.getFullName( you ) )
--> "Eric Someone"

Я написал статью, в которой обсуждается это (среди прочего):
Изучение Lua: псевдо-ООП Синтаксис и область действия .

Редактировать : Вот пример продолжения, подобный jQuery's each:

local Array = {}
function Array:new(...)
  local a = {...}
  setmetatable(a,{__index=self})
  return a
end
function Array:each(callback)
  for i=1,#self do
    callback(self[i],i,self[i])
  end
end
function Array:map(callback)
  local result = Array:new()
  for i=1,#self do
    result[i] = callback(self[i],i,self[i])
  end
  return result
end
function Array:join(str)
  return table.concat(self,str)
end

local people = Array:new( me, you )

people:each( function(self,i)
  print(self:getFullName())
end )
--> "Gavin Kistner"
--> "Eric Someone"

print( people:map(Person.getFullName):join(":") )
--> "Gavin Kistner:Eric Someone"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...