一道折了无数选手的lua面试题,你来试试?
Posted 洪流学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道折了无数选手的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
-- 函数不能赋值
小新:“哇,没想到这个题里面有这么多坑呢?”
大智:“哈哈,快去做吧。”
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。不仅仅有lua热更新教程哦。
https://edu.hongliu.cc
以上是关于一道折了无数选手的lua面试题,你来试试?的主要内容,如果未能解决你的问题,请参考以下文章