小编edw*_*rdw的帖子

Iteratee I/O:需要事先知道文件大小

假设我需要解析一个二进制文件,该文件以三个4字节幻数开头.其中两个是固定字符串.然而,另一个是文件的长度.

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Attoparsec
import Data.Attoparsec.Enumerator
import Data.Enumerator hiding (foldl, foldl', map, head)
import Data.Enumerator.Binary hiding (map)
import qualified Data.ByteString as S
import System

main = do
    f:_ <- getArgs
    eitherStat <- run (enumFile f $$ iterMagics)
    case eitherStat of
        Left _err -> putStrLn $ "Not a beam file: " ++ f
        Right _ -> return ()

iterMagics :: Monad m => Iteratee S.ByteString m ()
iterMagics = iterParser parseMagics

parseMagics :: Parser () …
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何在Rust中的日志输出中添加特定的前缀?

我有一个对象,希望每个日志记录输出都以该对象的某些状态为前缀。但是为每个日志记录语句添加前缀非常不便。有没有简单的实现方法?

下面是示例代码。

use log::info;

struct Obj {
    id: i32,
    name: String,
}

impl Obj {
    // can I use `info!("receive {} from {}", item, from);` for simplicity?
    fn call_me(&self, item: i32, from: String) {
        info!("[id: {}][name: {}] receive {} from {}", self.id, self.name, item, from);
    }
    // ...many methods
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

logging rust

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

迭代向量元素的组合并操作元素

我想获得向量元素的所有组合。我正在使用 itertools 的组合()函数。很好,但现在我想操纵向量的元素。因此我需要一个迭代器来生成向量元素的可变引用......

我的代码基本上如下所示:

let mut v: Vec<MyType> = vec![];
for vpair in v.iter_mut().combinations(2) {
     vpair.first().unwrap().do_something(vpair.last().unwrap());
}
Run Code Online (Sandbox Code Playgroud)

通过调用我想在每次迭代中do_something()操作vpair.first().unwrap()and 。vpair.last().unwrap()

我收到的错误是:

the trait std::clone::Clone is not implemented for &mut MyType

我能以某种方式解决这个问题还是我完全走错了路?

rust

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

Rust:使用部分移动的值

在Rust 0.8中:

struct TwoStr {
  one: ~str,
  two: ~str,
}

#[test]
fn test_contents() {
  let strs = TwoStr {
    one: ~"pillar",
    two: ~"post",
  };

  assert_eq!(strs.one, ~"pillar");
  assert_eq!(strs.two, ~"post");
}
Run Code Online (Sandbox Code Playgroud)

代码甚至不会编译.在rust test认为有一个在第二的错误assert_eq:

错误:使用部分移动的值: strs

这有点违反直觉.我的意思是,无论第一个assert_eq有什么影响,当执行到达第二个时,它应该远远超出范围assert_eq.除非当然,它会在场景后面产生一些东西.可以?

如果没有,为什么这个神秘的错误呢?希望我对Rust指针的理解没有根本的缺陷.

rust

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

没有实现 `{integer} % &amp;std::ops::Range&lt;{integer}&gt;`

我理解这个错误,但仍然不知道如何转换iu32/integer.

let n = 2;
for i in [1..10].into_iter() {
  if n % i == 0 {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

if n % (i as u32) == 0不起作用

帮助:该特征std::ops::Rem<&std::ops::Range<{integer}>>未实现{integer}

rust

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

在迭代器特征中指定关联类型的生命周期

我是 Rust 新手,我正在尝试找出在 Rust 中执行以下操作的最佳方法是什么:

struct ThingIterator {
    current: String,
    stop: String,
}

impl Iterator for ThingIterator {
    type Item = &str;
    fn next(&mut self) -> Option<&str> {
        if self.current == self.stop {
            return None;
        }
        // For testing
        self.current = self.stop;
        Some(&self.current)
    }
}

fn main() {
    let pi = ThingIterator {
        current: String::from("Ask"),
        stop: String::from("Zoo"),
    };
    println!("Number of things={}", pi.count());
}
Run Code Online (Sandbox Code Playgroud)

我的错误是:

error[E0106]: missing lifetime specifier
 --> src/main.rs:7:17
  |
7 |     type Item = &str;
  |                 ^ expected …
Run Code Online (Sandbox Code Playgroud)

rust

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

如何防止 Rust 程序释放()它不拥有的 C 字节

libc 有一个函数返回一个不应该是 free()d 的字符串。可以读取用户当前目录,/etc/passwd但不应是 free()d。如果我从指针创建一个字符串,程序会立即中止

free(): invalid pointer
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

显然,代码是不安全的。

let pw = libc::getpwnam(username.as_ptr() as *const i8);
let cd = (*pw).pw_dir;
let len = libc::strlen(cd);
builder.current_dir(String::from_raw_parts(cd as *mut u8, len, len));
Run Code Online (Sandbox Code Playgroud)

我可以mem::forget(s)使用字符串,但会泄漏内存,至少长度必须存储在某处。我只需要防止释放底层原始字节。项目是一个服务器,所以我不能忽视泄漏。

rust

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

有没有办法等待返回Result &lt;T,E&gt;而不是T?

我正在使用reqwest使用以下函数在API上进行get请求:

async fn get_item_response(client: &Client, id: &str) -> Result<Response, reqwest::Error> {
    let base = "http://someurl.com/item?={item_id}"
    .replace("{item_id}", id);
    client.get(&base).send()
}
Run Code Online (Sandbox Code Playgroud)
async fn main() -> Result<(), Box<dyn Error>> {
    let client = Client::new();
    let response = get_item_response(&client, "1").await?;
}
Run Code Online (Sandbox Code Playgroud)

响应是响应类型,而不是结果,这意味着如果不惊慌,我将无法检查是否发生了错误。有没有办法访问结果?

asynchronous rust async-await

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

Rust 借用了可能未初始化的变量 - 作为程序员,这对我来说是显而易见的,它总是会被初始化

我在这里遇到 Rust 编译器问题。这段代码最初是用 C 编写的,我的工作是将其移植到 Rust 代码中。我不会在这里修改算法或任何内容,但 Rust 编译器比 C 编译器更严格,并且它标记了完全有效的代码。

error[E0381]: borrow of possibly-uninitialized variable: `output_file_handler`
   --> src/main.rs:318:9
    |
318 |         output_file_handler.write(b"Why won't it work?");
    |         ^^^^^^^^^^^^^^^^^^^ use of possibly-uninitialized `output_file_handler`

error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)

我正在编写的这个程序使用 Rust 的 MPI 库,但现在让我们忽略它,因为它不是我的问题的一部分。

问题是,我File在函数顶部声明了一个可变对象main(),但在开始时未初始化。现在因为我使用的是 MPI,所以这是一个多进程程序。我正在对此进行一些简化,并删除对我的问题来说不必要的代码。

my_rank变量基本上保存当前正在执行的进程的“进程ID”,因为相同的代码可以由多个进程运行。进程my_rank == 0只负责将输出打印到文件,其他进程都不执行此操作。在 的进程中my_rank == 0output_file_handler是“活动的”,而在其他进程中,它保持未初始化状态,只是从未使用过。

除了声明之外,所有对 的访问都output_file_handler在进程中my_rank == 0,因此它在使用时总是被初始化。然而,编译器太愚蠢而无法意识到这一点,而且太严格,因此它会惩罚完美的代码

首先我有 的声明output_file_handler。然后我有一些代码启动 MPI 子系统并“分叉”一堆进程,并为每个进程分配其各自的等级。然后在之后 …

compilation rust

0
推荐指数
1
解决办法
2016
查看次数

即使在 if let 语句之后,值仍然包含在 Option 中

我有一个包含两个字段statechildren的结构体。Children 是一个包含孩子向量的选项。我正在使用 if let 语法将此选项解构回向量。

fn main() {
    let mut root = Node::new2d(3);
    loop {
        root.calc_scores(100);
        if let Some(mut children) = root.children {
            let child = children.pop();
            root = Node {
                state: child.0,
                children: None,
            }
        }
        root.make_children();
    }
}
struct Node<T> {
    state: T,
    children: Option<Vec<(T, i32)>>,
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不能编译。它抱怨 child 是 类型Option<(Board2d,i32)>。为什么 child 仍然包含在选项枚举中?不会if let Some(mut children) = root.children{}从 Option 枚举中取出向量吗?

rust

0
推荐指数
1
解决办法
134
查看次数

标签 统计

rust ×9

async-await ×1

asynchronous ×1

compilation ×1

haskell ×1

logging ×1