• 一步
    2019-06-19
    直接 lua 运行 table.getn 会报这样的错的 lua: table.lua:7: attempt to call a nil value (field 'getn')

    我查了一下, lua5.1 之后把这方法去掉了,那么为什么 luajit 和 openresty 不把这个方法废弃呢?还保留呢?

    作者回复: 因为 LuaJIT 是基于 Lua 5.1的语法来实现的,并没有跟随Lua 5.2 和 5.3

    
     2
  • 小飞哥 ‍超級會員
    2019-06-22
    localhost: ~/geektime/lua $ resty -e 'local color = {first = "red", "blue", third = "green", "yellow"}
    > color.first = nil
    > for k, v in pairs(color) do
    > print(v)
    > end'
    blue
    yellow
    green
    localhost: ~/geektime/lua $ resty -e 'local color = {first = "red", "blue", third = "green", "yellow"}
    > table.remove(color, 1)
    > for k, v in pairs(color) do
    > print(v)
    > end'
    yellow
    green
    red

    看结果为什么打印一个是正序,一个是倒序呢?
    展开

    作者回复: 字典的顺序是不保证的,大部分语言都是如何

    
     1
  • 石头Rocky
    2019-06-19
    setmetatable({ sock = sock }, mt) 构造函数返回的table是{ sock = sock }这个表。
    当调用方使用 set_timeout方法时,在表内找不到set_timeout方法,便会去__index所指的_M中去寻找。
    
     1
  • 一步
    2019-06-19
    对于lua-resty-mysql 模拟 OO原因,理解为 mysql 的连接是需要保持的,需要复用的,当一个连接建立之后是需要复用的,不能频繁的断开连接,建立连接
    
     1
  • 一步
    2019-06-19
    在luajit 扩展的table 函数中
    local new_tab = require('table.new')
    或者 require('table.clear')

    用 luajit 去执行 都会报错找不动 moudule的错误的
    luajit: table_luajit.lua:1: module 'table.new' not found:
    luajit 的版本 2.0.5
    展开

    作者回复: 需要 LuaJIT 2.1 的版本才行, 文档在这里:https://github.com/LuaJIT/LuaJIT/blob/v2.1/doc/extensions.html#L218

     1
     1
  • 卡卡
    2019-11-09
    前几节课不是说op的下标是从1开始吗?怎么这节课的例子又从0开始了?
    
    
  • michael
    2019-10-08
    请教一个问题,在大多数编写面向对象的情况下 采用如下方式
    local instance ={}
    self.__index = self
    setmetatable(instance, self)
    但是当我想实现一个类似于php的__get魔术方法时如下调用就出现了问题
    local instance ={data={"apple" =1}}
    self.__index = function(t,k)
    if instance.data[k] ~= nil //如果在data中存在则返回相应value
     return instance.data[k] //类似get魔术方法
    end
    return self //这一步出现大问题,后面实例化无法调用类方法
    setmetatable(instance, self)

    想知道问题的原因和解决方案,非常感谢,还有想加一个咱们Lua的交流群,希望能一起学习。
    展开
    
    
  • fjpcode
    2019-08-09
    lua-resty-mysql模拟oo封装一层,我的理解是:1. 屏蔽底层通信细节,统一使用or特色的cosocket实现非阻塞高效IO 2. 接口简单易用,让开发人员把精力聚焦在业务逻辑上,而不是这些底层的通信细节上。这也是OR秉承的里面。
    
    
  • 英雄
    2019-07-11
    是重载还是重写?java里面的重载是:指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同

    方法重写是:存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型

    作者回复: 按照你的定义就是重写。Lua 没有类的概念,是模拟出来的,所以做不到重载这么高级。

    
    
  • wusiration
    2019-07-01
    lua-resty-mysql 模拟OO,个人理解是便于复用mysql连接,无需反复开启mysql连接;麻烦老师解惑一下
    
    
  • 回家
    2019-06-26
    温铭老师好, 如果table中有nil元素,这个元素是不是不占用内存空间?
    
    
  • ArtEngr
    2019-06-21
    “另外,超出预设的空间大小,也可以正常使用,只不过性能会退化” 很多时候与外界交互数据,无法准确知道table大小。

    作者回复: 可以设置大一些,留一些缓存

    
    
  • John
    2019-06-20
    老师,能否专门讲解一下lua面向对象是如何实现继承,抽象类的,我看了orange的源码发现不太容易理解,源码如下:
    -- local BasePlugin = Object:extend()
    function Object:extend()
      local cls = {}
      for k, v in pairs(self) do
        if k:find("__") == 1 then
          cls[k] = v
        end
      end
      cls.__index = cls
      cls.super = self
      setmetatable(cls, self)
      return cls
    end


    function Object:implement(...)
      for _, cls in pairs({...}) do
        for k, v in pairs(cls) do
          if self[k] == nil and type(v) == "function" then
            self[k] = v
          end
        end
      end
    end
    展开

    作者回复: 不推荐用 Lua 的 table 来模拟实现继承等这种复杂的功能,就像你说的一样,可读性太差,一般人的脑子都转不过来。。。

     2
    
  • helloworld
    2019-06-19
    函数不可貌相,海水不可(斗量)
    :)

    作者回复: :)感谢 fix typo

    
    
  • helloworld
    2019-06-19
    一个是代码复用和代码缓存原因,性能可以提高;
    另外一个是可读性高,便于维护
    
    
我们在线,来聊聊吧