2014-09-28 3 views
2

Этот код в Lua будет применять функцию к значениювысшего порядка «методы» в Lua

function Apply(f, value) 
    return f(value) 
end 

Затем я могу использовать его, как это применять произвольные функции вызовов на мой объект игры, как так

Apply(Draw, GameObject) 
Apply(Update, GameObject) 

можно ли вместо этого делать то, что я бы, наверное, неправильно, вызовите метод более высокого заказ

function GameObject:Apply(f) 
    return self:f() 
end 

то, что я в конце концов, изнуренный t, чтобы сделать, есть таблица GameObjects, которую я могу вызывать Методы в пакетном режиме. Поэтому, используя эту концепцию более высокого порядка, которая может даже не существовать, я бы создал код, который делает следующее.

... 
--Create the batch object with three bullets in it 
BatchGameObjects = BatchGameObject:new(Bullet1, Bullet2, Bullet3) 


--Call equivelent to 
--Bullet1:DrawMethod() 
--Bullet2:DrawMethod() 
--Bullet3:DrawMethod() 

--Bullet1:UpdateMethod() 
--Bullet2:UpdateMethod() 
--Bullet3:UpdateMethod() 

BatchGameObjects:Apply(DrawMethod) 
BatchGameObjects:Apply(UpdateMethod) 

ответ

3

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

function BatchGameObjects:Apply(function_name) 
    -- ... or iterate on objects in any other way that matches how you store them ... 
    for idx = 1, #self.object_list do 
     local object = self.object_list[idx] 
     object[function_name](object) 
    end 
end 
+0

Спасибо, что отлично работало. Одна из потенциальных возможностей для других, использующих это, - это использовать функцию, которую вы хотите передать ей как строку. IE BatchGameObjects: Apply ("Draw"). Благодаря!!! – user514156

+0

@ user514156, да, вот что я имел в виду, когда я сочувствовал «имени». –

Смежные вопросы