许多Java jar中包含的manifest.mf包含的标题看起来很像电子邮件标题.见例子[*]
我想要一些可以将这种格式解析为键值对的东西:
Map<String, String> manifest = <mystery-parse-function>(new File("manifest.mf"));
Run Code Online (Sandbox Code Playgroud)
我已经搜索了一下"解析manifest.mf""manifest.mf格式"等等,我发现了很多关于标题含义的信息(例如在OSGI包中,标准的Java jar等),但那不是什么我在找.
看一些示例manifest.mf文件,我可能会实现解析它的东西(反向工程格式),但我不知道我的实现是否真的正确.所以我也不是在寻找别人快速抛出解析函数,因为它遇到了同样的问题).
对我的问题的一个很好的答案可以指向我的格式规范(所以我可以编写自己的正确的解析函数).最好的答案将我指向已经具有正确实现的现有开源库.
使用 Go 1.18 中的新泛型,我认为可以创建一个“Either[A,B]”类型,该类型可用于表达某物可以是 A 类型或 B 类型。
您可能会使用此功能的情况是函数可能返回两个可能值之一作为结果(例如,一个表示“正常”结果,一个表示错误)。
我知道 Go 处理错误的“惯用”方式是返回“正常”值和错误值,对于错误或值返回 nil。但是……让我有点困扰的是,我们本质上是在类型中说“这返回 A和B”,而我们真正想说的是“这返回 A或B”。
所以我想也许我们可以在这里做得更好,我认为这也可能是一个很好的练习,可以看到/测试我们可以用这些新泛型做的事情的界限。
可悲的是,尽我所能,到目前为止我还没有能够解决这个练习并让任何东西工作/编译。从我一次失败的尝试来看,这是一个我想以某种方式实现的接口:
//A value of type `Either[A,B]` holds one value which can be either of type A or type B.
type Either[A any, B any] interface {
// Call either one of two functions depending on whether the value is an A or B
// and return the result.
Switch[R any]( // <=== ERROR: interface methods must have no …
Run Code Online (Sandbox Code Playgroud) 我已经实现了一个提供一些 linting 的语言服务器。linter 检查所需属性并发出“缺少属性”错误。我想为这些错误提供相应的“插入缺失的属性”快速修复。
我认为 LSP 协议的一般领域是:
这样,服务器可以为“缺失属性”诊断标记返回“插入缺失属性”命令。
但是服务器如何实现“插入缺失的属性”命令本身呢?
查看 lsp 规范,我找不到任何可以让服务器注册命令的内容。
我确实在这里找到了一些关于 vscode apis 的信息,用于在客户端注册命令:https ://code.visualstudio.com/docs/extensionAPI/vscode-api
所以我想我可以在客户端注册并实现“插入缺失的属性”,但是......
客户端只是一个“愚蠢”的包装器,将大部分工作委托给服务器。因此,它并不真正理解文档结构,也不是实现需要理解该结构的文档转换的好地方。
似乎我最好的选择是向我的语言服务器添加一些“自定义”协议,以便我可以在客户端实现“插入缺失的属性”命令,但将计算 quickfix 编辑的困难部分委托给服务器.
或者,还有更好的方法?
visual-studio-code vscode-extensions language-server-protocol
这是对此问题的后续问题.
人们普遍认为,做一个广泛的'捕获(例外)'是一个坏主意.
推理通常类似于"你必须正确处理异常"和"抓住你能处理的东西"和其他一些通用的声音参数.
那些通用的答案听起来很合理,但它们并不能让我满意.
让我具体一点.这是典型的代码,它应该是"坏的".
try {
... do something...
} catch (Exception e) {
log(e); //leave a trace for debugging
return ...a value the context can deal with...
}
Run Code Online (Sandbox Code Playgroud)
一个怀疑的头脑仍然不相信不处理异常(这可能会炸毁整个程序),必然比以这种通用方式处理它更好.
所以我真的想要一些特定的,令人信服的例子,带有代码片段,实际上发生了一些不好的事情,因为一个像上面那样过于宽泛的catch子句.
PS:人们可以用Java以外的其他语言来思考这个问题,但是由于我想要特定的例子,这实际上是关于Java程序和JRE可能引发的特定异常.
PS2:我特别感兴趣的是Exception的例子,它实际上是java.lang.Exception的子类型,而不是更广泛的'Throwable'.因此,排除像'OutOfMemoryError'这样的东西作为有效的例子.
假设我想定义一个名为 的函数,它接受类似or 的zero
字符串并返回 float 或 int 的零值。"f"
"i"
所以我们可以做这样的事情(我没有真正的实现,这只是模拟我想要的):
utop # zero "f"
- : float = 0.0
utop # zero "i"
- : int = 0
Run Code Online (Sandbox Code Playgroud)
OCaml 中的哪些语言功能使这种事情成为可能?您如何实际使用这些功能来完成类似的事情?(即有人可以展示/解释如何做到这一点吗?)。
PS:在几乎任何其他语言中,我都不认为这样的事情是可能的。但我认为在 OCaml 中确实如此!我认为是这样,因为Printf.printf
从Stdlib
做的事情非常相似(精神上相似,但细节复杂得多)。即这些例子的共同点是,Printf.printf "..."
也有一个静态类型,该类型取决于/根据作为其第一个参数传递的值而变化。
我试图通过查看源代码来理解它是如何工作的,Printf
但它有点太复杂了,对我来说是一个难以理解的深渊。我希望zero
上面函数的这个更简单但类似的示例能够让某人解释解决方案的本质,而无需使用 printf 的“格式化语法”的所有复杂性。