小编mca*_*ton的帖子

如何获取`&str`之间的字节偏移量

我有两个&str 指向同一个 string,我需要知道它们之间的字节偏移量:

fn main() {
    let foo = "  bar";
    assert_eq!(offset(foo, foo.trim()), Some(2));

    let bar = "baz\nquz";
    let mut lines = bar.lines();
    assert_eq!(offset(bar, lines.next().unwrap()), Some(0));
    assert_eq!(offset(bar, lines.next().unwrap()), Some(4));

    assert_eq!(offset(foo, bar), None); // not a sub-string

    let quz = "quz".to_owned();
    assert_eq!(offset(bar, &quz), None); // not the same string, could also return `Some(4)`, I don't care
}
Run Code Online (Sandbox Code Playgroud)

这与 基本相同str::find,但由于第二个切片是第一个切片的子切片,我希望更快。如果几行相同,也str::find不会在这种lines()情况下工作。

我以为我可以使用一些指针算法来做类似的事情,foo.trim().as_ptr() - foo.as_ptr()但事实证明这Sub不是在原始指针上实现的。

rust

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

petgraph 中的哪个算法会找到从 A 到 B 的最短路径?

我有一个有向图,想找到从节点 A 到节点 B 的最短路径。我在crates.io搜索并找到了petgraph,它看起来像是最受欢迎的 crate。它实现了许多算法,但没有一个能解决我的任务。我错过了什么?

例如,Dijkstra 算法返回路径成本,但哪条路径的成本最低?该Bellman-Ford算法返回路径成本和节点,但没有路径。

这是我发现从图中打印路径的最简单方法:

extern crate petgraph;
use petgraph::prelude::*;
use petgraph::algo::dijkstra;

fn main() {
    let mut graph = Graph::<&str, i32>::new();
    let a = graph.add_node("a");
    let b = graph.add_node("b");
    let c = graph.add_node("c");
    let d = graph.add_node("d");

    graph.extend_with_edges(&[(a, b, 1), (b, c, 1), (c, d, 1), (a, b, 1), (b, d, 1)]);
    let paths_cost = dijkstra(&graph, a, Some(d), |e| *e.weight());
    println!("dijkstra {:?}", paths_cost);

    let …
Run Code Online (Sandbox Code Playgroud)

rust petgraph

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

Rust 会暴露调用堆栈深度吗?

背景信息:我有一个函数可以直接或通过其他函数间接调用自身,并且希望有一种廉价的方法可以在程序耗尽调用堆栈时优雅地失败。我可以手动计算呼叫数,但我想要一种更优雅、更强大的方式来实现这一点。

是否可以使用稳定的 Rust 确定当前的调用堆栈深度?

我能找到的唯一选择是:

  1. 遵循ASM中的堆栈,但它要求不稳定且不可移植。
  2. 使用 GNU libc 扩展(回溯)。然而,回溯太浪费而且也不标准。

recursion callstack rust

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

在Windows VM和Linux主机之间共享Git存储库

我主要在Linux上工作,但我也有一个Windows VM,主要用于在Windows上运行单元测试.

在Linux中,我有一个Git存储库,可以使用VirtualBox共享文件夹从Windows VM访问.我不在Windows上使用Git,除了我们的构建系统,它记录当前的Git哈希以将其包含在可执行文件中(运行git describe --always --dirty).

现在,每次我在Linux或Windows上使用Git,然后再在另一个系统上使用Git,它需要一段时间.例如:

  Linux$ git status
  Linux$ git status # fast (<1s)
Windows$ git status # takes a few dozen seconds
Windows$ git status # fast (<1s)
  Linux$ git status # takes a few seconds
  Linux$ git status # fast (<1s)
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以防止这种情况发生吗?我可以在Windows上关闭Git功能,因为它只需要获取哈希值.但是我无法改变获取此哈希的方式,因为这在构建系统中很深.我也不希望在Linux和Windows上有单独的存储库并且彼此提交/推送,因为这会导致更大的开销.

Linux git版本:2.11.0.

Windows git版本:2.14.1.windows.1.

git shared-directory

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

LLVM作为不同语言的基本编译器

我是LLVM编译器和基础架构的新手.我有以下想法.Clang是C/C++的LLVM前端,类似Rustc for Rust编程语言.两者都可以发出LLVM IR代码,并且可以将发出的代码编译为可执行应用程序.

我的问题是可以链接不同的编程语言吗?示例如下 -

/* Code in C */
int add(int, int);
int main()
{
  printf("%d", add(5 ,6));
}
Run Code Online (Sandbox Code Playgroud)

以Rust中定义的函数为例

// Code in Rust
fn main()
{
  println!("{}", add(5, 6));
}

fn add (x: i32, y: i32) -> i32
{
  x + y
}
Run Code Online (Sandbox Code Playgroud)

从两个源文件生成IR后,是否可以链接它们并创建单个应用程序?

我很想知道这是否有效,请告诉我.

c llvm dynamic-linking llc rust

5
推荐指数
2
解决办法
638
查看次数

Facebook响应错误中的“ error_subcode”:33是什么意思?

有人知道这是什么意思error_subcode吗:Facebook回应错误33?我知道这与任务许可有关,但我想100%确定。

我们收到以下错误:

{"error":{"message":"Unsupported get request. Object with ID 'XXXX'
does not exist, cannot be loaded due to missing permissions, or does
not support this operation. Please read the Graph API documentation at
https://developers.facebook.com/docs/graph-api","type":"GraphMethodException","code":100,"error_subcode":33,"fbtrace_id":"BRwGjA9kkKU"}}
Run Code Online (Sandbox Code Playgroud)

但是在有关Graph API的Facebook API文档 https://developers.facebook.com/docs/graph-api/using-graph-api/中,我找不到error_subcode值33。

我希望我可以依靠此子代码来验证我没有从Facebook API获取资源的权限,因为我不想依赖错误消息。

facebook-graph-api facebook-marketing-api

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

如何输入注释宏的返回值?

请看一下这个有点人为的例子:

use std::io::{Read, Result};

macro_rules! read_u8 {
    ($r:expr) => {{
        let mut buf = [0; 1];
        $r.read_exact(&mut buf)?;
        Ok(buf[0])
    }};
}

fn t<R: Read>(r: &mut R) -> Result<u8> {
    let x = read_u8!(r)?;
    Ok(x)
}

fn main() {
    use std::io::Cursor;
    let mut x: Cursor<Vec<u8>> = Cursor::new(vec![1, 2, 3]);

    match t(&mut x) {
        _ => println!("Done"),
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试运行此示例,则会得到:

error[E0282]: type annotations needed
  --> src/main.rs:12:13
   |
12 |     let x = read_u8!(r)?;
   |             ^^^^^^^^^^^^ cannot infer type for `_` …
Run Code Online (Sandbox Code Playgroud)

macros types rust

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

如何在 Spring Boot 应用程序上的 Swagger API 中提供身份验证

我已经集成了 Swagger,以使用 Spring Boot 为 Spring REST 应用程序生成 API 文档。它运行良好,当我点击 URL 时,我可以看到生成的 API 文档:http://localhost:8080/test/swagger-ui.html 我的问题是如何限制对 API 的访问?基于硬编码用户名和密码的基本身份验证至少在开始时应该足够好。我使用 Maven 添加“swagger2”依赖项。

这是 pom.xml:

<dependency>                                                                           
    <groupId>io.springfox</groupId>                                                      
    <artifactId>springfox-swagger2</artifactId>                                          
    <version>2.7.0</version>                                                             
</dependency>                                                                          
<dependency>                                                                           
    <groupId>io.springfox</groupId>                                                      
    <artifactId>springfox-swagger-ui</artifactId>                                        
    <version>2.7.0</version>                                                             
</dependency>  
Run Code Online (Sandbox Code Playgroud)

这是招摇的配置:

@Configuration                                                                         
@EnableSwagger2                                                                        
public class SwaggerConfig {                                                           
    @Bean                                                                              
    public Docket api() {                                                              
        return new Docket(DocumentationType.SWAGGER_2)                                 
          .select()                                                                    
          .apis(RequestHandlerSelectors.basePackage("com.eeocd.test.ws.resource"))     
          .build();                                                                    
    }                                                                                  
}                                                                                      
Run Code Online (Sandbox Code Playgroud)

swagger swagger-2.0

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

如何在 Rust 中迭代宏的参数?

我正在尝试创建一个宏,用固定大小填充向量的第一个元素。其余元素应为零。我写:

const SIZE: usize = 3;

#[derive(Debug)]
struct MyVec {
    data: [f32; SIZE]
}

macro_rules! my_vec {
    ($($x:expr),*) => [{
        let mut data: [f32; SIZE] = [0.0; SIZE];
        for (i, e) in x.enumerate() {
            data[i] = e;
        }
        MyVec { data }
    }]
}

fn main() {
    let v = my_vec![1.0, 2.0];
    println!("{:?}", v);  // must be MyVec { data: [1.0, 2.0, 0.0] }
}
Run Code Online (Sandbox Code Playgroud)

看起来我试图以错误的方式迭代参数。我该如何解决?

rust

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

使用 Json.NET 禁用特定类型的类型注释

在远离$type注释的过程中(为了使数据语言独立),我在理解各种TypeNameHandling注释和类型契约的优先级方面遇到了一些问题。

在转换过程中,新类型和旧类型都将包含在相同的文件中。因此,该文件必须包含除新类型(ISettings实现)之外的所有类型的注释。

我试图用以下最小示例重现我的问题:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Linq;
using Newtonsoft.Json.Serialization;

namespace jsontest
{
    // I can't touch this class, even to add annotations
    // (in practice there are too many classes to update)
    interface IDoNotTouchThis {}
    class DoNotTouchThisClass : IDoNotTouchThis {
        public IMustHaveType MustHaveType => new HasType();
    }

    // This is the old data. It must have type annotations to be deserialized.
    interface IMustHaveType {}
    class HasType : IMustHaveType {}

    // …
Run Code Online (Sandbox Code Playgroud)

c# json.net

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