- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我相信有一种方法可以“干净地”处理这个问题,我只是不太清楚。
use git2::Repository;
// Prints out the current branch and sha if it exists.
fn report_repo() -> () {
Repository::open(".")
.ok()
.and_then(branch_and_sha)
.and_then(|branch_sha| => { // Fails here with E0061
let (branch, sha) = branch_sha;
println!("Branch={} sha={}", branch, sha);
None
});
}
fn branch_and_sha(repo: Repository) -> Option<(String, String)> {
match repo.head().ok() {
Some(reference) => {
match (reference.name(), reference.target()){
(Some(branch), Some(sha)) => Some((branch.to_string(), sha.to_string())),
_ => None
}
},
None => None
}
}
出现的错误是E0061 ,我认为这是因为从 branch_and_sha()
返回的选项中的“值”是一个元组。 branch_and_sha()
有效地说,“如果有一个存储库,获取它的引用,如果存在,如果它同时具有名称(分支)和目标(sha),则返回带有该信息的 Option<(String, String)>
- 否则返回 None
。并且报告功能想要做一些事情if所有的Repository
,分支和sha 都可以找到——除此之外别无他法。(它不应该出错或 panic 。)
在某种程度上这是人为的——它是一个乐观报告函数的例子,类似于我想写的几个。我正在寻找一种干净、惯用的方法来做到这一点。重点是'几个深度和几个分支可以返回None
这应该导致无操作,否则会使特定的(叶)信息可用。具体错误是我应该如何处理 and_then
函数,很难找到类似的问题。
最佳答案
首先,你有一个小错字。 Rust 中的闭包不使用 =>
.所以你的闭包应该看起来更像
.and_then(|branch_sha| { // Note: No => here
let (branch, sha) = branch_sha;
println!("Branch={} sha={}", branch, sha);
None
});
那么我们得到的错误是
--> so_cleanly.rs:15:10
|
15 | .and_then(|branch_sha| {
| ^^^^^^^^ cannot infer type for type parameter `U` declared on the associated function `and_then`
|
and_then
使用两个通用参数声明:U
和 F
(从技术上讲,还有 T
,但这取决于接收器的类型 self
,所以我们不用担心)。现在,F
是闭包的类型并且总是由参数决定。另一方面,U
是闭包的返回类型。
闭包必须返回 Option<U>
. Rust 需要查看闭包并确定它的返回类型是什么。闭包返回什么?它返回 None
, 和 None
可以是Option<U>
对于任何 U
存在。 Rust 不知道使用哪一个。我们需要告诉它。我们可以在返回 None
的行上这样做来自
None as Option<()>
或在and_then
调用自己。
.and_then::<(), _>(|branch_sha| { ... })
但是,编译器提出了一个非常有道理的观点。 and_then
和公司产生了 Option
类型的结果,你忽略了。您正在编写一段有副作用且不产生值的代码,这是明智的,但您使用的是用于返回值的功能接口(interface)。它可以 完成,但它可能不是惯用的。在意识到 ()
之前,我不得不看你的代码几次。返回值不是错字。
一种选择是返回 Option<()>
来自你的 report_repo
. ()
在里面表明我们不关心除了副作用之外的任何事情,Option
让 report_repo
的来电者处理(或忽略)过程中发生的任何错误,而您当前的函数只是无条件地抑制所有错误。
fn report_repo() -> Option<()> {
Repository::open(".")
.ok()
.and_then(branch_and_sha)
.map(|branch_sha| {
let (branch, sha) = branch_sha;
println!("Branch={} sha={}", branch, sha);
// Implicit return of () here, which we could do explicitly if we wanted
})
}
我在这里做了一些细微的改动。返回类型是 Option<()>
现在。根据这一点,函数内行的末尾没有分号(我们返回该值)。最后,最后and_then
是 map
,因为最后一步不能失败,只是对 Some
做了一些工作.
这是一个改进,但它可能仍然不是我编写此函数的方式。
相反,如果您要针对副作用执行代码,请考虑使用 ?
operator , 这确实 and_then
和 map
恶作剧,但保持控制流程相对线性。 and_then
它的 friend 非常适合构造值,但你的函数的要点是它应该读起来像一系列指令,而不是值的构造函数。这就是我编写该函数的方式。
fn report_repo() -> Option<()> {
let repo = Repository::open(".").ok()?;
let (branch, sha) = branch_and_sha(repo)?;
println!("Branch={} sha={}", branch, sha);
Some(())
}
以 ?
结尾的每一行有效地说“如果这个东西是 None
,现在返回 None
。否则,继续。”但是粗略的看了一下代码是“open the repo, branch and sha, and then print”,这正是你想让人们一眼就看到的。
如果我们想要真正做到这一点,我们可能应该返回 Result<(), Error>
, 其中Error
是一些更详细的错误类型,但对于这个简单的示例片段来说,这有点过分了。
关于rust - 选项、and_then() 和元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68735235/
给定一个 Option[Future[Option[Int]]] : scala> val x: Option[Future[Option[Int]]] = Some ( Future ( Some
如果我理解正确,EitherT[Option,A,B] 应该与 Option[Either[A,B]] 相同,但编译器不同意.以下代码编译失败: def f[A,B] = implicitly[Eit
我刚开始在使用 parcel.js 构建静态 Assets 时遇到此错误。它在本地工作,但我在 Heroku 上的构建出错,我不确定它是否相关。 最佳答案 得到同样的问题。通过将 core-js 安装
当我生成 Telerik Report 时,只有 Export PDF 可用。即使我将 docx 和 xlsx 的配置设置为 true。这是我在网络配置中的配置。
我的 iTunesConnect 应用程序显示 Apple Pay 选项。我正在使用布伦特里。 即使我们没有在应用程序中使用 Apple Pay 功能。 有人可以帮我解决如何在我的 itunesCon
我正在 Raspbian 中从命令行运行以下查询: mysql -u $NAME -p $PASS Tweets -e "SELECT count(*) FROM raw_tweets;" 它输出以下
我正在尝试使用 ffmpeg(在 linux 下)为视频添加一个小标题。所以,我使用: ffmpeg -i hk.avi -r 30000/1001 -metadata title="SOF" hk_
我正在尝试使用 ffmpeg 使用 ffserver 流式传输视频。您将在 ffserver1.conf 文件下方找到 ffmpeg 命令的日志输出。 其中一个错误引用了预设,每次我尝试使用预设时,我
我正在尝试对 Option 使用 fold 或 map 操作而不是 match。 我有一个选项 val ao: Option[String] = xxxx 和一个函数 f: (String => Fu
Dockerfile documentation表示有可能通过 --platform FROM 中的选项像这样的指令: FROM [--platform=] [AS ] 在我的 dockerfile
我不确定“属性(property)”或“选项”是否是正确的术语,但这是我需要弄清楚的。 鉴于以下情况: ' $.fileup({ url: '/file/upload',
我正在尝试使用 jQuery 检查是否选择了值 = 1 的选择选项,然后将类添加到某些元素。但有些东西不起作用。可以请人看一下代码吗? 我的代码: Reservation
我对 VIM 中的这些感到困惑。有些事情需要设置,而另一些则让。 而且,我如何检查某个选项。我知道这是一个选项,因为我使用 set 来更改它。 例如,如何检查当前文件类型选项是否为 java? 最佳答
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我在看《Professional F# 2.0》一书作者展示如下代码 let a string : option = None if a.IsNone then System.Console.
我习惯使用方法顶部的 java 样板检查输入参数: public static Boolean filesExist(String file1, String file2, String file3
假设我有一串 "Insert Post -title Some PostTitle -category 2 -date-posted 2013-02:02 10:10:10" 我一直在尝试做的是将这个
从 1.3.70 EAP 开始,在 org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions 这是 var useIR: kotlin.Boolean 哪个激活
我无法获取订购捆绑商品的所有子产品及其选项。这可能吗? 最佳答案 以下是您如何找出哪些产品应与所有其他项目一起附加到列表中的捆绑产品中的方法: foreach ($order->getAllItems
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我是一名优秀的程序员,十分优秀!