我最近经常使用 kotlin arrow,并且遇到了一个让我陷入困境的特定用例。
假设我有一些对象的集合,我想使用转换函数将其转换为另一种数据类型。我们还假设这个转换函数有失败的能力——但它不会抛出异常,而是返回一个 Either,其中Either.Left()是失败,Either.Right()是映射对象。处理这个用例的最佳方法是什么?下面是一些示例代码:
val list: Collection<Object> // some collection
val eithers: List<Either<ConvertError, NewObject>> = list.map { convert(it) } // through some logic, convert each object in the collection
val desired: Either<ConvertError, Collection<NewObject>> = eithers.map { ??? }
fun convert(o: Object) : Either<ConvertError, NewObject> { ... }
Run Code Online (Sandbox Code Playgroud)
本质上,我想在数据集合上调用映射函数,如果任何映射响应失败,我希望包含Either.Left()错误。否则,我希望Either.Right()包含所有映射的对象。
有什么干净的方法来做到这一点的想法吗?理想情况下,我希望进行一系列函数调用,但能够通过函数调用向上渗透错误。
我在C中编写一个函数,它将获取一个字符串并删除所有不是小写字母字符的字符.我到目前为止编写了这段代码:
void strclean(char* str) {
while (*str) {
if (!(*str >= 'a' && *str <= 'z')) {
strcpy(str, str + 1);
str--;
}
str++;
}
}
Run Code Online (Sandbox Code Playgroud)
当我传递字符串"hello [] [] world"时,该函数似乎主要工作,除了输出是:
hellowoldd
Run Code Online (Sandbox Code Playgroud)
当我在输入if语句的每一行之后打印它时,这是我收到的输出:
hello][]woldd
hello[]woldd
hello]woldd
hellowoldd
Run Code Online (Sandbox Code Playgroud)
它似乎非常接近,但我不明白为什么它会产生这个输出!最奇怪的部分是我已经将代码提供给其他两个朋友,它在他们的计算机上工作正常.我们都运行相同版本的Linux(ubuntu 14.04.3),并且都使用gcc进行编译.
我不确定代码是否存在导致输出不一致的问题,或者是否是导致问题的编译器问题.也许它与我的机器上的strcpy相比,与他们相比?
我试图只打印wget命令的一小部分输出.如果我输入
wget http://google.com --spider --server-response
Run Code Online (Sandbox Code Playgroud)
我收到一个很长的输出列表到我要搜索的终端.其中一条线是
Content-Length: 219
Run Code Online (Sandbox Code Playgroud)
我想要做的就是阅读并打印出219号到标准输出.我在另一个堆栈溢出线程上找到了答案(在wget之前获取文件的文件大小为wget?)
wget http://google.com --spider --server-response -O - 2>&1 | sed -ne '/Content-Length/{s/.*: //;p}'
Run Code Online (Sandbox Code Playgroud)
我理解这个命令有两个主要的困难.我希望有人可以向我详细解释这两件事.
sed通常需要输入文件吗?管道wget命令的输出不会使其成为文件.怎么没有这个呢?
我不明白 - 是什么意思.我查了一下linux手册页,它提到它是为了"脚本"?这个标志很重要,因为没有它,没有任何作用.这是什么意思?此外,命令的其余部分发生了什么,如何打印出数字?
很抱歉问一个以前回答的问题,但我没有找到任何有意义的解释,我想尝试使用替代解决方案!