Notifications
Article
一道折了无数选手的lua面试题,你来试试?
Published 4 months ago
149
0
一道折了无数选手的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 -- 函数不能赋值
小新:“哇,没想到这个题里面有这么多坑呢?”
大智:“哈哈,快去做吧。”
如果你已经尽力思考了,但是还有某些地方做不出来,可以到洪流学堂公众号回复李雷和韩梅梅获取参考答案。
Tags:
大智
技术探路者/创业者/效率达人/终身学习者 - Student
11
Comments