以下Rust代码编译并运行没有任何问题.
fn main() {
let text = "abc";
println!("{}", text.split(' ').take(2).count());
}
Run Code Online (Sandbox Code Playgroud)
在那之后,我尝试了类似的东西....但它没有编译
fn main() {
let text = "word1 word2 word3";
println!("{}", to_words(text).take(2).count());
}
fn to_words(text: &str) -> &Iterator<Item = &str> {
&(text.split(' '))
}
Run Code Online (Sandbox Code Playgroud)
主要问题是我不确定函数to_words()应该具有什么返回类型.编译器说:
error[E0599]: no method named `count` found for type `std::iter::Take<std::iter::Iterator<Item=&str>>` in the current scope
--> src/main.rs:3:43
|
3 | println!("{}", to_words(text).take(2).count());
| ^^^^^
|
= note: the method `count` exists but the following trait bounds were not satisfied:
`std::iter::Iterator<Item=&str> : std::marker::Sized`
`std::iter::Take<std::iter::Iterator<Item=&str>> …Run Code Online (Sandbox Code Playgroud) 我是Dart/Flutter的新手,想建立一个简单的应用程序,其中LinearProgressBar每秒都会更新.
没有太多的实际代码,我有以下设置工作.
一切都按预期工作,但有一个例外.当我在Android设备的后台移动应用程序时,'tick'会继续打印.
在原生Android上,当触发'onPause'事件时,我会取消我的定期计时器.
Flutter有类似的东西吗?我能找到的只是'initState'和'dispose'.但是,在将应用程序移动到后台时,不会调用Dispose.
我不希望计时器在后台继续滴答作响.
在我的研究中,我发现这个Stack Overflow问题onresume-and-onpause-for-widgets-on-flutter.它的答案建议使用TickerProviderStateMixin.
我用下面的方法.
class _BarItemState extends State<BarItem> with SingleTickerProviderStateMixin {
Ticker ticker;
num progress = 1.0;
@override
void initState() {
super.initState();
ticker = createTicker((duration) => setState(() {
debugPrint('tick');
progress = duration.inSeconds / 30;
}))
..start();
}
// other stuff omitted
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我仍然不满意.
原因是,自动收报机回调现在每隔几毫秒调用一次,而不是每秒调用一次.在我看来,这似乎是浪费资源(我不需要流畅的动画),...我是否过于复杂的事情?
即使我的用例似乎不需要它,我仍然想知道:
如何自己处理onPause/onResume事件?
我正在尝试通过firebase_admob将admob集成到我的flutter应用程序中.
默认情况下,它似乎只是将横幅叠加/堆叠在当前视图的顶部...而不考虑实际的窗口小部件树及其约束.
我真的不知道为什么有人会设计这样的库......但是好的.也许是出于反欺诈的原因?!
为了避免用横幅覆盖实际内容,我想在我的内容中添加填充(填充高度= banner-height).
由于我使用的是"智能横幅",因此库会动态尝试在运行时为给定的屏幕尺寸找到最佳横幅尺寸.
如何找出它想出的横幅尺寸?
有没有人知道像jsfiddle.net这样的在线服务,但是对于 Angular Dart Code?
我为自己设定了一项小任务,以获取一些Rust基本知识。任务是:
从stdin读取一些键-值对,并将它们放入哈希图中。
然而,事实证明这是比预期更棘手的挑战。主要是由于对一生的理解。下面的代码是经过几次实验后我目前拥有的,但是编译器并没有停止对我大喊大叫。
use std::io;
use std::collections::HashMap;
fn main() {
let mut input = io::stdin();
let mut lock = input.lock();
let mut lines_iter = lock.lines();
let mut map = HashMap::new();
for line in lines_iter {
let text = line.ok().unwrap();
let kv_pair: Vec<&str> = text.words().take(2).collect();
map.insert(kv_pair[0], kv_pair[1]);
}
println!("{}", map.len());
}
Run Code Online (Sandbox Code Playgroud)
编译器基本上说:
`text` does not live long enough
Run Code Online (Sandbox Code Playgroud)
据我了解,这是因为“文本”的生存期仅限于循环的范围。因此,我在循环内提取的键值对也绑定到循环边界。因此,将它们插入外部地图将导致指针悬空,因为“文本”将在每次迭代后销毁。(如果我错了,请告诉我)
最大的问题是:如何解决这个问题?
我的直觉说:
创建键值对的“拥有副本”,并将其生命周期“扩展”到外部范围..但是我不知道如何实现这一目标。
我是Rust的新手,我发现很难理解整个所有权/借用概念....甚至在阅读了所有官方指南之后.
为什么以下代码编译没有任何问题?
use std::io;
fn main() {
let mut input = io::stdin();
let mut lock = input.lock();
let mut lines_iter = lock.lines();
for line in lines_iter {
let ok = line.ok();
let unwrap = ok.unwrap();
let slice = unwrap.as_slice();
println!("{}", slice);
}
}
Run Code Online (Sandbox Code Playgroud)
......但这不是吗?
use std::io;
fn main() {
let mut lines_iter = io::stdin().lock().lines();
for line in lines_iter {
let slice = line.ok().unwrap().as_slice();
println!("{}", slice);
}
}
Run Code Online (Sandbox Code Playgroud)
从我天真的角度来看,两个代码示例完全相同.唯一的区别是第一个使用一些中间变量,而第二个是链接函数调用.
在编译第二个时,它会对我大吼大叫
- error: borrowed value does not live long enough
- note: …Run Code Online (Sandbox Code Playgroud) 为什么下面的Rust-Code没有失败?!
fn main() {
let a:usize = -2;
assert!(a == -2);
}
Run Code Online (Sandbox Code Playgroud)
a不能否定.两者都没有发生,为什么?
编译器不应该保护我免受常见溢出问题的影响吗?
我想配置我的串行通信没有奇偶校验,1个开始和2个停止位.该文档的Serial.begin(speed, config)状态:
(...)可选的第二个参数配置数据,奇偶校验和停止位.默认值为8个数据位,无奇偶校验,一个停止位.
该文档还列出了可能的配置值.根据我(有限)的理解,我需要SERIAL_7N2或SERIAL_8N2来满足我的要求.(我不确定数据位如何与我需要的1-start-bit相关.)
但是,我甚至无法编译,因为我不知道如何将该配置值提供给begin方法.(我没有太多的Arduino/C++经验).
在我的代码中,我尝试了以下两种变体:
Serial.begin(9600, SERIAL_8N2);
Serial.begin(9600, "SERIAL_8N2");
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
附加信息:
Serial.begin(speed, config)已经推出了最新的Arduino 1.0.2 IDE版本.
可以找到定义/实现begin方法的代码:
编辑:
根据PeterJ和borges的回复,以下变体是正确的.
Serial.begin(9600, SERIAL_8N2);
Run Code Online (Sandbox Code Playgroud)
但是,它仍然无法正常工作.
我发现如果我将配置的电路板从我的Arduino Leonardo更改为Arduino Uno,则不会发生编译错误.
因此,它可能是只有一部分电路板发生的错误......或者它可能不受支持?!
编辑2:
它现在已经解决了:) borges的答案向我指出了正确的解决方案!