“扩展”“字符串”表 – 怎么做?这甚至是个好主意吗?
发布时间:2020-12-15 00:26:15 所属栏目:大数据 来源:网络整理
导读:我正在开发一个Lua库,我需要在其中大写给定字符串的第一个字母.因此我创建了以下功能: local capitalize = function(s) return string.gsub (s,"(%w)([%w]*)",function (first,rest) return string.upper(first) .. rest end,1 )end 这最初是一个“内部”功
我正在开发一个Lua库,我需要在其中大写给定字符串的第一个字母.因此我创建了以下功能:
local capitalize = function(s) return string.gsub (s,"(%w)([%w]*)",function (first,rest) return string.upper(first) .. rest end,1 ) end 这最初是一个“内部”功能,仅在我的库中使用. 现在我意识到我的用户在某些情况下会想要使用这个功能. 问题1 string.capitalize = function(s) ... etc etc (same code as above) 问题2 编辑 – 如果有人在将来发现这一点,string recipes页面上会显示一个更简单的“大写”功能: str = str:gsub("^%l",string.upper) 解决方法
我经常对内置表进行扩展.我这样做主要是因为我认为缺少一些非常重要的东西.资本化并没有成为我的“重要”列表,例如,有一些名为string.split的东西.
当我这样做时,我遵循一个编程约定: require 'stringutil' -- load extra stuff into string.* require 'osutil' -- load extra stuff into os.* 你明白了. 当我小心的时候,我做的另一件事是确保我不会覆盖那些尚未存在的东西,这样我才能面向未来: function extend(tab,field,val) if tab[field] == nil then tab[field] = val return val elseif tab[field] ~= val then error(string.format('Extension %s.%s failed: already occupied by %s',nameof(tab),tostring(val))) else return val end end 功能名称是这样的: function nameof(val) for name,v in pairs(_G) do if v == val then return name end end return '?' end 最后说明:当我打算与其他人共享代码时,我倾向于不修改预定义的表.根据黄金法则,这个命名空间是由每个人共享的,如果我要让其他人使用我的代码,那么在我预定义的字符串表中抓取我想要的任何字段对我来说是不公平的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |