如何将给定的两段CoffeeScript代码转换为Lua代码?
CoffeeScript转Lua代码解析
第一段代码解析与转换
这段CoffeeScript是创建一个绑定了当前上下文的匿名判断函数,逻辑是验证传入的contextObject是否满足三个并列条件:
contextObject的isInherent或isAdditionalInherent属性为真contextObject的isHiddenToUI属性为假- 当前上下文对象调用
getGameSession()后,再通过getModifierClassForType(contextObject.type)获取的类,其isHiddenToUI属性为假
CoffeeScript里的bind(@)是把函数内的@(对应JS里的this)固定为当前上下文,Lua没有原生的bind方法,但可以用闭包实现相同效果。假设当前上下文在Lua中用self表示,转换后的代码如下:
-- 直接创建绑定了当前self的判断函数 local checkContext = function(contextObject) local gameSession = self:getGameSession() local modifierClass = gameSession:getModifierClassForType(contextObject.type) return (contextObject.isInherent or contextObject.isAdditionalInherent) and not contextObject.isHiddenToUI and not modifierClass.isHiddenToUI end
如果需要动态生成绑定不同上下文的函数,可以封装成一个创建函数:
function createCheckContextFunc(self) return function(contextObject) local gameSession = self:getGameSession() local modifierClass = gameSession:getModifierClassForType(contextObject.type) return (contextObject.isInherent or contextObject.isAdditionalInherent) and not contextObject.isHiddenToUI and not modifierClass.isHiddenToUI end end -- 使用时传入目标上下文 local checkFunc = createCheckContextFunc(targetSelf)
第二段代码解析与转换
这段CoffeeScript是给类的原型添加一个别名属性:让isNotOwnedByPlayer直接指向原型上的isOwnedByGameSession方法,相当于两个属性引用同一个函数。
在Lua用元表模拟类的实现中,转换方式如下:
-- 给类原型(元表)添加别名,所有实例都会继承这个属性 YourClass.isNotOwnedByPlayer = YourClass.isOwnedByGameSession -- 如果是给单个实例添加别名 self.isNotOwnedByPlayer = self.isOwnedByGameSession
内容的提问来源于stack exchange,提问作者5242 Bora
相关产品推荐
相关产品推荐

