由于某种原因,Rust编译器抱怨Result没有实现unwrap,即使我提供的错误类型确实实现了Debug.下面提供了错误的代码.
use std::fmt::{Display, Debug};
use std::error::Error;
trait MyError: Error + Display + Debug {}
type MyResult<T> = Result<T, MyError>;
trait Foo: Clone {}
trait MyTrait {
fn my_function<T: Foo>(&self) -> MyResult<T>;
fn unwrap_function<T: Foo>(&self) -> T {
self.my_function().unwrap()
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义类型pub struct Foo,我希望能够说字符串可以转换为Foo类型.我正在努力impl<'a> Into<Foo> for &'a str,但我从这个答案中知道我不能这样做.我还有其他选择吗?
对于上下文,我正在尝试做类似的事情
trait Foo {
type ArgType;
fn new<I: Into<Self::ArgType>>(arg: I) -> Self;
}
struct MyType;
impl Into<MyType> for str {
fn into(self) -> MyType { MyType }
}
struct Bar;
impl Foo for Bar {
type ArgType = MyType;
fn new<I: Into<MyType>>(arg: I) -> Bar { Bar }
}
Run Code Online (Sandbox Code Playgroud) 我得到了一个与该库一起使用的蛇版本threepenny-gui,但我不喜欢这样的事实:我显式调用newEvent并addStateUpdate手动而不是完全基于事件定义行为,例如:
(updates, addUpdate) <- liftIO newEvent
managerB <- accumB initialManager updates
on UI.tick timer $ \_ -> addUpdate $ \manager -> manager'
Run Code Online (Sandbox Code Playgroud)
相比:
managerB <- accumB initialManager $
UI.tick timer $> \manager -> manager'
Run Code Online (Sandbox Code Playgroud)
IIUC 第二个是更惯用的 FRP,因为它定义了实际事件的行为,而不是创建代理事件来代理更新。但是当我进行此更改时,它会导致以下两个问题之一:
managerB首先定义(使用 RecursiveDo 访问timer,其定义如下),则根本不会渲染任何内容managerB到末尾(使用 RecursiveDo 从 DOM 元素访问managerB),第一次按下箭头键时的初始移动会滞后,并且帧会以不稳定的方式呈现。难道我做错了什么?我应该用什么惯用的方式来构建这些事件/行为?
代码差异在这里:https ://github.com/brandonchinn178/snake/compare/inline-event-handlers