我正在将 Firefox Add-on SDK 扩展移植到 WebExtensions。以前我可以访问浏览器的搜索引擎,但现在我不能,所以一位乐于助人的用户建议我尝试阅读 search.json.mozlz4 文件,该文件包含每个已安装的引擎。然而,这个文件是带有 LZ4 压缩的 json,它是 Mozilla自己的 LZ4 格式,带有一个自定义的幻数,'mozLz40\0'。
以前,可以使用它来读取使用 LZ4 压缩的文本文件,包括 mozlz4 文件:
let bytes = OS.File.read(path, { compression: "lz4" });
let content = new TextDecoder().decode(bytes);
Run Code Online (Sandbox Code Playgroud)
(虽然我找不到有关“压缩”字段的文档,但它有效)
现在,使用 WebExtensions,我能想到的最好的读取文件是
var reader = new FileReader();
reader.readAsText(file);
reader.onload = function(ev) {
let content = ev.target.result;
};
Run Code Online (Sandbox Code Playgroud)
这不会以任何方式处理压缩。这个库处理 LZ4 ,但它用于 node.js 所以我不能使用它。[编辑:它也可以独立工作]。但是,即使我删除了自定义幻数处理,我也无法解压缩文件,而相比之下,此 Python 代码按预期工作:
import lz4
file_obj = open("search.json.mozlz4", "rb")
if file_obj.read(8) != b"mozLz40\0":
raise InvalidHeader("Invalid magic number")
print(lz4.block.decompress(file_obj.read()))
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 JS 中做到这一点?
我有这个例子C#代码:
class Stuff { } // empty class
void Main()
{
var list = new List<Stuff> {
new Stuff(),
new Stuff()
};
Fun(list);
}
void Fun<T>(List<T> a)
{
Debug.Log("called List<T> Fun");
foreach (T t in a) {
Fun(t);
}
}
void Fun(Stuff a)
{
Debug.Log("called Stuff Fun");
}
void Fun<T>(T a)
{
Debug.Log("called T Fun");
}
Run Code Online (Sandbox Code Playgroud)
调用Main()最终打印:
called List<T> Fun
called T Fun
called T Fun
Run Code Online (Sandbox Code Playgroud)
我不明白为什么编译器能够Fun<T>(List<T> a)按预期调用,但后来不知道调用Fun(Stuff a),哪个更具体Fun<T>(T a).在编译时是否确定T Stuff在这种情况下是肯定的?typeof(T)内部打印 …