小编for*_*emo的帖子

返回迭代器(或任何其他特征)的正确方法是什么?

以下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)

rust

92
推荐指数
1
解决办法
2万
查看次数

如何在Flutter App中处理onPause/onResume?

我是Dart/Flutter的新手,想建立一个简单的应用程序,其中LinearProgressBar每秒都会更新.

没有太多的实际代码,我有以下设置工作.

  • 基于传递时间计算进度的函数.
  • 显示进度的LinearProgressBar.
  • 定期计时器每秒重新计算进度并更新进度条.
  • 我每次都调试'tick',重新计算完成.

一切都按预期工作,但有一个例外.当我在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事件?

android timer ticker dart flutter

12
推荐指数
2
解决办法
6467
查看次数

如何获得智能横幅的横幅尺寸?

我正在尝试通过firebase_admob将admob集成到我的flutter应用程序中.

默认情况下,它似乎只是将横幅叠加/堆叠在当前视图的顶部...而不考虑实际的窗口小部件树及其约束.

我真的不知道为什么有人会设计这样的库......但是好的.也许是出于反欺诈的原因?!

为了避免用横幅覆盖实际内容,我想在我的内容中添加填充(填充高度= banner-height).

由于我使用的是"智能横幅",因此库会动态尝试在运行时为给定的屏幕尺寸找到最佳横幅尺寸.

如何找出它想出的横幅尺寸?

android admob dart firebase flutter

11
推荐指数
1
解决办法
698
查看次数

Angular Dart 有类似 jsfiddle.net 的东西吗?

有没有人知道像jsfiddle.net这样的在线服务,但是对于 Angular Dart Code?

dart angular-dart

5
推荐指数
1
解决办法
183
查看次数

从循环内部将借入的值存储到外部作用域中的容器?

我为自己设定了一项小任务,以获取一些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

5
推荐指数
1
解决办法
853
查看次数

链接函数调用vs使用中间变量

我是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)

compiler-errors lifetime rust

4
推荐指数
1
解决办法
365
查看次数

为什么我可以为无符号整数变量赋一个负数?

为什么下面的Rust-Code没有失败?!

fn main() {
    let a:usize = -2;
    assert!(a == -2);
}
Run Code Online (Sandbox Code Playgroud)
  • 我期望编译时错误,因为我试图将有符号数分配给无符号变量.
  • 我也希望断言失败,因为a不能否定.

两者都没有发生,为什么?

编译器不应该保护我免受常见溢出问题的影响吗?

rust

3
推荐指数
1
解决办法
1405
查看次数

Serial.begin(speed,config)没有为Leonardo Board编译

我想配置我的串行通信没有奇偶校验,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的答案向我指出了正确的解决方案!

arduino

2
推荐指数
1
解决办法
1万
查看次数