加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在lua中模拟javascript` this`行为

发布时间:2020-12-14 21:46:04 所属栏目:大数据 来源:网络整理
导读:我一直很喜欢在 Javascript中你可以通过f.call(newThisPtrValue)来设置this指针的值的方式.我在lua写了一些东西来做这件事,它起作用: _G.call = function(f,self,...) local env = getfenv(f) setfenv(f,setmetatable({self = self},{__index = env})) loca
我一直很喜欢在 Javascript中你可以通过f.call(newThisPtrValue)来设置this指针的值的方式.我在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

有几点我不确定:

>我希望unpack({…})有性能开销.有没有解决的办法?
>这有可能以任何方式严重破坏功能的环境吗?
>这是一个真的不好的想法吗?

解决方法

Lua的伪OOP的一个很好的好处是它已经非常容易实现:

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"

我写了一篇讨论这个问题的文章(除此之外):
Learning Lua: Pseudo-OOP Syntax and Scope.

编辑:这是一个像jQuery一样的持续例子:

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],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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读