我有一个函数返回一个Result
:
fn find(id: &Id) -> Result<Item, ItemError> {
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后另一个使用它像这样:
let parent_items: Vec<Item> = parent_ids.iter()
.map(|id| find(id).unwrap())
.collect();
Run Code Online (Sandbox Code Playgroud)
如何在任何map
迭代中处理失败的情况?
我知道我可以使用flat_map
,在这种情况下,错误结果将被忽略:
let parent_items: Vec<Item> = parent_ids.iter()
.flat_map(|id| find(id).into_iter())
.collect();
Run Code Online (Sandbox Code Playgroud)
Result
迭代器有0或1个项目,具体取决于成功状态,flat_map
如果为0则会过滤掉它.
但是,我不想忽略错误,我想改为使整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误).
如何在Rust中最好地处理这个问题?
我有一个由某些结构实现的特征.我想写一个模式匹配,我可以处理每个可能的情况:
trait Base {}
struct Foo {
x: u32,
}
struct Bar {
y: u32,
}
impl Base for Foo {}
impl Base for Bar {}
fn test(v: bool) -> Box<Base + 'static> {
if v {
Box::new(Foo { x: 5 })
} else {
Box::new(Bar { y: 10 })
}
}
fn main() {
let f: Box<Base> = test(true);
match *f {
Foo { x } => println!("it was Foo: {}!", x),
Bar { y } => println!("it was …
Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法从一个元素中删除元素Vec<T>
?
有一个叫做的方法remove()
,它需要一个index: usize
,但是index_of()
我甚至都看不到一种方法.
我正在寻找(希望)简单和O(n)的东西.
我正在尝试使用nginx代理WebSocket + HTTP流量.
我读过这个:http://nginx.org/en/docs/http/websocket.html
我的配置看起来像:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name ourapp.com;
location / {
proxy_pass http://127.0.0.1:100;
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
1)连接每分钟关闭一次.
2)我想在同一个端口上运行HTTP和WS.应用程序在本地工作正常,但如果我尝试将HTTP和WS放在同一个端口并设置此nginx代理,我得到这个:
与'ws://ourapp.com/ws'的WebSocket连接失败:意外的响应代码:200
加载应用程序(HTTP)似乎工作正常,但WebSocket连接失败.
以下编译正常:
pub struct Reader<'a> {
position: uint,
data: &'a [u8]
}
Run Code Online (Sandbox Code Playgroud)
它是一个读者,它将一个类型的矢量(实际上是一个片段)u8
作为参考,并指定生命周期.
然而,这并不是我想要的.我希望能够使结构通用,更准确地说,我想表示类型应该是任何东西的切片.我为初学者尝试了这个:
pub struct Reader<'a, T> {
position: uint,
data: &'a T
}
Run Code Online (Sandbox Code Playgroud)
它并不表示T
是一个切片,但这已经失败了一条消息:
参数类型
T
可能不够长; 考虑添加显式生命周期绑定T:'a
...
好的,我只需要指定生命周期.
但现在我的问题是如何使它成为切片类型的通用并具有生命周期?我尝试了类似的东西Reader<'a, T: 'a Vec>
,T: 'a [T]
但我不知道我应该如何表示这一点,官方指南似乎没有处理这样的情况.
我只是想通过借用它来构造一个接受任何类型切片的Reader,并提供对数据进行操作的方法(以只读方式).
我查看了API文档和语言指南,但我没有看到任何关于在Dart中发送电子邮件的信息.我也检查了这个google群组帖子,但Dart标准已经很老了.
这可能吗?我知道我总是可以使用Process类来调用外部程序,但是如果有的话,我更喜欢真正的Dart解决方案.
我有一个订阅流的Web组件.
由于Web组件每次显示时都会重新创建,因此我必须清理订阅者并重做它.
现在我将所有订阅者添加到列表中,并在removed()
生命周期方法中我正在做:
subscriptions.forEach((sub) => sub.cancel());
Run Code Online (Sandbox Code Playgroud)
现在,问题是:当没有显示Web组件时,没有人监听流.问题是组件在未显示时缺少数据/事件.
我需要的是缓冲.在注册监听器时,需要缓冲事件并立即发送事件.根据文档,缓冲发生直到监听器注册:
控制器将缓冲所有传入事件,直到订户注册.
这样可行,但问题是侦听器会在某些时候删除并重新注册,并且看起来这不会触发缓冲.
看起来缓冲只是最初发生,即使所有听众都不在,也不会在以后发生.
所以问题是:在这种听众可能会消失的情况下,如何缓冲?
我目前正在尝试使用用户名和电子邮件在Dart中创建一个简单的表单以进行注册.
我找不到一个可以测试的完整工作示例.如果有人可以解释如何将下面的jQuery代码转换为Dart,我认为这将大大澄清事情.
我也见过FormData
Dart课程,但没有例子.任何帮助表示赞赏.
$("#submit").click( function() {
$.post( $("#myForm").attr("action"),
$("#myForm :input").serializeArray(),
function(info) {
$("#responseDiv").empty();
$("#responseDiv").html(info);
});
$("#myForm").submit( function() {
return false;
});
});
Run Code Online (Sandbox Code Playgroud) 鉴于此代码:
Element elem = new Element.html("<p>This is a paragraph.</p>");
document.body.append(elem);
document.body.children.add(elem);
document.body.nodes.add(elem);
Run Code Online (Sandbox Code Playgroud)
结果都是一样的,当我add
到body.children
或body.nodes
.两者有什么区别?哪个更好?
以下代码有效,我不知道为什么:
File::open(&some_path).read_to_end().unwrap();
Run Code Online (Sandbox Code Playgroud)
看看API文档,我可以看到File::open()
返回IoResult
没有的文档read_to_end()
.
是否存在某种语法糖?难道Result<T, Error>
不知何故变成Result<U, Error>
?
文档:http://doc.rust-lang.org/std/io/fs/struct.File.html#method.read_to_end