一道折了无数选手的腾讯最难lua面试题,你来试试?

洪流学堂,让你快人几步。

小新:“今天我去参加一个游戏公司的面试,有个lua笔试题,简直给我难哭了/(ㄒoㄒ)/~~”

大智:“啥题啊这么难?都给我们小新心态搞崩了?”

小新:“哎,本来我lua学的就还不咋地,就会个基础的,这题给我整蒙了都。题目是这个:”

function class(...)
    -- TODO
end

-- TODO 补充修改实现 class 方法
A =
    class {
    name = string,
    age = int,
    foo = function()
        print('from A', name, age)
    end
}

B =
    class {
    __super = A,
    foo = function()
        print('from B', name, age)
    end
}

local a = A()
a.name = 'hanmeimei'
a.age = 17
a:foo()

local b = B()
b.name = 'lilei'
b.age = 18
b:foo()

a.name = 20
a.age = '20'
b.foo = 'x'

-- 输出

-- from A hanmeimei 17
-- from B lilei 18
-- 类型不匹配:name 的类型是 string
-- 类型不匹配:age 的类型是 number
-- 函数不能赋值

大智:“嗯,这道题对你来说确实难度不小,我想看看你是怎么做的?”

小新:“我只做出来一部分,结果面试官跟我说我把原题改动太大了。。。”

大智:“啊喂,你这写的也太秀了。人家题目里写了TODO的地方,明摆着是让你补全class函数,你这可好,给人家全部重构了一遍。”

小新挠头道:“嘿嘿,这个远超出我的能力范围了嘛。那这个题答案是什么呢?”

大智:“想知道答案?那是不可能的。我给你说一下思路,你先自己去尝试尝试。”

小新:“好的好滴。”

大智:“我先在代码中将提示部分标识出来,你按照提示的顺序,从1开始,仔细去理解每一部分。”

function class(...)
    -- TODO
end

-- TODO 补充修改实现 class 方法
-- 提示[3]:class函数应该接收一个table作为参数,可以大概判断此处是为了定义"类"的成员,需要用到元表
A =
    class {
    -- 提示[4]:string是一个lua的内置对象,此处一定需要修改,可以大概判断是为了定义name的类型
    name = string,
    -- 提示[5]:int在这什么都不代表,所以值是nil,没有任何用,此处一定需要修改,可以大概判断是为了定义age的类型
    age = int,
    -- 提示[6]:foo函数体中的name和age,前面都没有加self,所以用的是全局变量,需要考虑使用setfenv(且需要注意5.2+这个函数被移除了)
    foo = function()
        print('from A', name, age)
    end
}

B =
    class {
    -- 提示[7]:在这设置了__super来实现继承,所以class函数中需要处理__super
    __super = A,
    foo = function()
        print('from B', name, age)
    end
}

-- 提示[1]:从下面这几行代码可以看出来,A可能是个函数,也可能是设置了__call的table,调用后返回值是一个table
local a = A()
a.name = 'hanmeimei'
a.age = 17
a:foo()

-- 提示[2]:从下面这几行代码可以看出来,B可能是个函数,也可能是设置了__call的table,调用后返回值是一个table
local b = B()
b.name = 'lilei'
b.age = 18
b:foo()

-- 提示[8]:根据本题最后的输出要求,赋值类型错误时需要提示错误,所以需要对赋值进行特殊处理(用__newindex)
a.name = 20
a.age = '20'
b.foo = 'x'

-- 输出

-- from A hanmeimei 17
-- from B lilei 18
-- 类型不匹配:name 的类型是 string
-- 类型不匹配:age 的类型是 number
-- 函数不能赋值

小新:“哇,没想到这个题里面有这么多坑呢?”

大智:“哈哈,快去做吧。”

如果你已经尽力思考了,但是还有某些地方做不出来,可以到洪流学堂公众号回复李雷和韩梅梅获取参考答案。

发布了138 篇原创文章 · 获赞 72 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/zhenghongzhi6/article/details/99084309