我有一个实现lint插件的Rust库.我想包括compiletest,但不要求在测试之外.指定依赖项仅用于测试的正确方法是什么?
我正在构建一个Rust库,并希望给它一些润色.在rustdoc中,我有时想在文档中链接到库的其他部分,例如fns,traits或structs.这是什么官方语法?
所以我打算在Intellij Community Edition上调试我的Solr过滤器插件.在我使用此命令从命令提示符运行程序后
java -jar start.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8983
Run Code Online (Sandbox Code Playgroud)
我用这个配置启动了我的Intellij调试器:
Transport : socket
Debugger mode : attach
Host : localhost
Port : 8983
Run Code Online (Sandbox Code Playgroud)
但是当我运行调试器时出现了这个错误:
Error running Debugger: Unable to open debugger port (localhost:8983):
java.io.IOException "handshake failed - connection prematurally closed"
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
我注意到Rust的测试有一个测量执行时间的基准模式ns/iter,但我找不到测量内存使用情况的方法.
我该如何实施这样的基准?让我们假设目前我只关心堆内存(虽然堆栈使用也肯定会很有趣).
编辑:我发现这个问题要求完全相同的事情.
我想用一些随机数作为基准:
#![feature(test)]
/// benchmarks for different map implementation
extern crate test;
extern crate rand;
use test::Bencher;
use rand::Rng;
#[bench]
fn setup_random_hashmap(b: &mut Bencher) {
let mut val : u32 = 0;
let mut rng = rand::thread_rng();
let mut map = std::collections::HashMap::new();
b.iter(|| { map.insert(rng.gen::<u32>(), val); val += 1; })
}
Run Code Online (Sandbox Code Playgroud)
但是,rustc回来了:
bench.rs:14:16: 14:32 error: unresolved name `rand::thread_rng`
bench.rs:14 let mut rng = rand::thread_rng();
Run Code Online (Sandbox Code Playgroud)
thread_rng定义rand为a pub fn.我错过了什么声明?我在用1.2.0-nightly (8f9f2fe97 2015-06-07).
我正在使用Intellij Idea 14大型java项目,其中编译了大量代码并且没有源代码.
据我所知Idea,无法在编译代码中进行搜索(如同eclipse),但它可以使用内置程序对单个文件进行反编译fernflower,这也可以通过编译代码进行调试.
有没有办法像Idea那样以同样的方式反编译所有已编译的代码并将其附加到项目中,这样就可以搜索"Project and Libs"而无需在反编译源中丢失调试功能?
我尝试使用Bytecodeviewer不同的fernflower选项,但结果是在附加反编译源后调试被破坏(显示错误的行).
在mutagen中,我在代码中注入了各种突变.我想改变的一件事是模式
if let Ok(x) = y { .. }.然而,这构成了相当大的挑战,因为我无法知道其类型y- 用户可以使用一元Ok变体构建自己的枚举.我仍然可以机会性地改变它,因为我们实际上有一个Result错误类型实现的情况Default使用类似于以下简化的特征:
#![feature(specialization)]
pub trait Errorer {
fn err(self, mutate: bool) -> Self;
}
impl<X> Errorer for X {
default fn err(self, _mutate: bool) -> Self {
self
}
}
impl<T, E> Errorer for Result<T, E>
where
E: Default,
{
fn err(self, mutate: bool) -> Self {
if mutate {
Err(Default::default())
} else {
self
}
}
}
Run Code Online (Sandbox Code Playgroud)
唉,实现的错误并不多Default,所以这不太有用.即使是实现 …
LLVM 似乎忽略core::intrinsics::assume(..)调用。它们最终会出现在字节码中,但不会更改生成的机器码。例如,采用以下(无意义的)代码:
pub fn one(xs: &mut Vec<i32>) {
if let Some(x) = xs.pop() {
xs.push(x);
}
}
Run Code Online (Sandbox Code Playgroud)
这编译成一大堆程序集:
example::one:
push rbp
push r15
push r14
push r12
push rbx
mov rbx, qword ptr [rdi + 16]
test rbx, rbx
je .LBB0_9
mov r14, rdi
lea rsi, [rbx - 1]
mov qword ptr [rdi + 16], rsi
mov rdi, qword ptr [rdi]
mov ebp, dword ptr [rdi + 4*rbx - 4]
cmp rsi, qword ptr [r14 + 8]
jne …Run Code Online (Sandbox Code Playgroud) 在标准库中,文档显示了如何实例化MaybeUninits的数组
:
let arr: [MaybeUninit<T>; N] =
MaybeUninit::uninit().assume_init();
Run Code Online (Sandbox Code Playgroud)
我们知道这是安全的,因为的合同MaybeUninit允许使用未初始化的值。接下来,我们被要求ptr::write(value)用来初始化每个元素。但这unsafe又需要代码。我们还知道覆盖a MaybeUninit是安全的,因为它没有drop任何作用。那么,为什么不覆盖它arr[i] = MaybeUninit::new(value)呢?
查看文档和代码,它看起来str是一个原始类型,String而是一个struct { Vec<u8> }.现在,作为str是一个[u8]什么String是一个Vec<u8>,不能str被定义为
struct str { slice: [u8]; }
Run Code Online (Sandbox Code Playgroud)
类似于AsciiStr的定义方式?为什么/它(仍然?)被定义为原始的?
rust ×8
java ×2
benchmarking ×1
debugging ×1
decompiling ×1
internals ×1
llvm ×1
llvm-codegen ×1
memory ×1
performance ×1
rust-cargo ×1
rustdoc ×1
unsafe ×1