扩展标准库而不是修改标准库
有一些用户反馈这个问题时还能保持礼貌,而有一些用户就直接飙脏话对我进行辱骂,仿佛更新标准库 —— 侵犯了他什么神圣的权利。
我今天特别解释一下这个问题:
1、aardio 并没有自动升级的功能,一定是你手动点击更新 —— 标准库才会更新。如果你主动去更新标准库,又不想标准库被更新,这是非常矛盾的一个需求。
2、如果你想扩展标准库的功能,你并不需要修改标准库。只要简单的增加一个新的库,继承并扩展原来的库函数即可。
我举个简单的例子,例如我现在想扩展一下 com.excel 里的 SaveAs 函数,增加保存 pdf 的功能,那么可以新建一个库,我随便取个名字,例如就叫 com.excel2,然后我们编写代码如下:
import com.excel;
namespace com{
class excel2{
ctor( ... ){
this = ..com.excel( ... )
};
}
SaveAs = function(path,format){
if(!#path) error('请指定保存路径',2);
if(format===null){
var ext = ..string.match(path,'[^.]+$');
if( ext ){
format = ( {
pdf = 0/*_xlTypePDF*/;
xps = 1/*_xlTypeXPS*/;
xls = 0x2B/*_xlExcel9795*/;
xlsx = 0x33/*_xlOpenXMLWorkbook*/;
xlsm = 0x2E/*_xlXMLSpreadsheet*/;
xlsb = 0x32/*_xlExcel12*/;
} ) [..string.lower(ext)];
};
}
path = ..io.fullpath(path);
if(format<=1) return owner.ActiveWorkbook.ExportAsFixedFormat(format,path);
return owner.ActiveWorkbook.SaveAs(path,format );
};
}
/**intellisense()
com.excel2() = 创建 Excel 对象\n!excel.
end intellisense**/
你可能会想为什么不直接加到标准库呢?!首先 Excel 存为 pdf 是个不常见的操作 ,90%的人用不到你的代码却要执行你的代码其实也不公平。另外你要更愉快地保存为 pdf ,其实还有个更复杂的 ExportAsFixedFormat2 函数,复杂到你可以去实现一个新的库 —— 可能代码比 com.excel 还要长。我们编写标准库 —— 就要随时控制我们可能无限膨胀的欲望,保持一个库主要只做一件事。
上面是一个类库,如果是普通的静态名字空间,扩展就更容易,例如我们要在 console 库里增加一个 log2 函数,可以增加一个库叫 console2 ,然后代码这样写:
import console
console2 = console;
console2.log2 = function(...){
}
那么如果你要对标准库进行较大的修改,或者改动一些库文件内部私有函数要怎么办呢?!这时候你也可以直接复制标准库的源代码,改一个库名称,然后想怎么改就怎么改。
真的任何时候你都完全没有必要去直接改动标准库文件。我们编程就是解决各种各样的问题,而不是给自己不必要地制造麻烦。
不要误解:aardio 不是不愿意改进标准库,实际上 aardio 更新非常活跃,我仅仅是想提醒大家 —— 不要局限于用标准库解决问题。