问题:是否有一个简单的sh/bash/zsh/fish/...命令来打印我提供的文件的绝对路径?
用例:我在目录中/a/b,我想c在命令行上打印文件的完整路径,以便我可以轻松地将其粘贴到另一个程序中:/a/b/c.简单但是一个小程序可以在处理长路径时节省大约5秒钟,这最终会增加.因此,令我惊讶的是,我无法找到标准实用程序来执行此操作 - 真的没有吗?
这是一个示例实现,abspath.py:
#!/usr/bin/python
# Author: Diggory Hardy <diggory.hardy@gmail.com>
# Licence: public domain
# Purpose: print the absolute path of all input paths
import sys
import os.path
if len(sys.argv)>1:
for i in range(1,len(sys.argv)):
print os.path.abspath( sys.argv[i] )
sys.exit(0)
else:
print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
sys.exit(1)
Run Code Online (Sandbox Code Playgroud) 我有一个失败的货物测试:
$ cargo test
[snip]
Running target/gunzip-c62d8688496249d8
running 2 tests
test test_extract_failure ... FAILED
test test_extract_success ... ok
failures:
---- test_extract_failure stdout ----
task 'test_extract_failure' panicked at 'assertion failed: result.is_err()', /home/dhardy/other/flate2-rs/tests/gunzip.rs:19
failures:
test_extract_failure
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured
task '<main>' panicked at 'Some tests failed', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libtest/lib.rs:250
Run Code Online (Sandbox Code Playgroud)
如何在GDB之类的调试器中启动失败测试?
这应该是一个普遍的问题,但对于那些想要回溯我的步骤的人来说,安装一个最近的每晚Rust构建和:
git clone https://github.com/dhardy/flate2-rs.git
git checkout 24979640a880
cd flate2-rs
cargo test
Run Code Online (Sandbox Code Playgroud) 我可以得到这样的枚举的整数值:
enum MyEnum {
A = 1,
B,
C,
}
let x = MyEnum::C as i32;
Run Code Online (Sandbox Code Playgroud)
但我似乎无法做到这一点:
match x {
MyEnum::A => {}
MyEnum::B => {}
MyEnum::C => {}
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能匹配枚举值或尝试转换x回MyEnum?
我可以看到这样的函数对枚举很有用,但它可能不存在:
impl MyEnum {
fn from<T>(val: &T) -> Option<MyEnum>;
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个脚本,它必须修补XML文件,包括用另一个元素替换一个元素列表.以下函数将补丁(包含可能为空的同名元素列表)应用于父元素的同名元素列表(也可能是空列表).(这只是修补逻辑的一小部分).
为什么,当我运行代码时,是否会出现以下错误?
org.w3c.dom.DOMException: NOT_FOUND_ERR: An attempt is made to reference a node in a context where it does not exist.
at com.sun.org.apache.xerces.internal.dom.ParentNode.internalRemoveChild(ParentNode.java:503)
at com.sun.org.apache.xerces.internal.dom.ParentNode.removeChild(ParentNode.java:484)
at CombineSweeps$PTReplaceNodeList.apply(CombineSweeps.java:514)
Run Code Online (Sandbox Code Playgroud)
(第514行标记如下.)据我所知,我刚刚验证了元素是否存在(因为NodeList是实时的,它的第一个条目将始终是下一个匹配或null).有趣的是,这并不总是一个问题.
private static class PTReplaceNodeList extends PTBase {
private final String name;
private final String nextElement;
private final List<Node> childList;
...
int apply(Document document, Node parent, Node node_unused) {
NodeList nodes;
// A marker for where to insert our nodes.
// We make a guess using nextElement (if null, means at end).
Node refNode …Run Code Online (Sandbox Code Playgroud) 获得回溯会很好.
$ cargo test
Running target/debug/partition_ops-b31bcf7b82e2e8d5
running 1 test
thread 'create_small' has overflowed its stack
Process didn't exit successfully: `/home/dhardy/other/pippin/target/debug/partition_ops-b31bcf7b82e2e8d5` (signal: 11)
To learn more, run the command again with --verbose.
Run Code Online (Sandbox Code Playgroud) 如何在自定义类型中使用"+ ="等复合运算符?
重载一些基本的运营商通过实施是可能的Add,Sub等等.但似乎没有任何支持+=,也没有x += y自动解释为x = x + y(从1.0 alpha版本).
如果您有一个键/值对的排序映射(或只是键),其中一个明显的操作是获取第一个或最后一个(或键).
C++的std::vector方便了front()与back()用于这一目的.std::map没有,但是*map.begin()和*map.rbegin()(反向迭代器),用于这方面的工作(假定人知道地图不为空).
在Rust中,获取地图的第一个元素似乎需要map.iter().next().unwrap()- 丑陋,但考虑到需要进行一些错误检查可能是合理的.
但是我们怎样才能获得最后一个元素呢?通过加强对所有元素:map.iter().last().unwrap()?
我知道有Iterator::rev(),map.iter().rev().next().unwrap()合理的替代方案呢?
我有一个返回指针的C函数:
type MYSQL_RES_REF = *mut c_void;
type MYSQL_ROW = *const *const c_char;
#[no_mangle]
extern "C" {
fn mysql_fetch_row(res: MYSQL_RES_REF) -> MYSQL_ROW;
}
let pointer = mysql_fetch_row(self.res);
let row_p = match pointer {
p if p == (0 as *const *const c_char) => panic!(),
p => p,
};
let field: &[u8] = unsafe { ffi::c_str_to_bytes(row_p[i]) };
Run Code Online (Sandbox Code Playgroud)
但尝试索引它(最后一行)会导致错误:
error: cannot index a value of type `*const *const i8`
Run Code Online (Sandbox Code Playgroud)
我想知道std::c_vec是不是我想要的,但显然已被删除.
在以下代码中:
void ResourceFitter::copyToLarvalResources( const gsl_vector* input ){
assert( input->size == invLarvalResources.size() );
if( invLarvalResources.size() != 365 ){
cout<<"error: iLR.size(): "<<invLarvalResources.size()<<endl;
exit(21);
}
// inverting larval resources may help fitting algorithm, so we do that here:
for( size_t i=0; i<invLarvalResources.size(); ++i ){
if( i >= 365 ){
cout<<"error: i="<<i<<endl;
exit(22);
}
double val = gsl_vector_get( input, i );
invLarvalResources[i] = 1.0 / val;
}
}
Run Code Online (Sandbox Code Playgroud)
这是 ResourceFitter.cpp 中的几行。第 380 行是最后一行代码(在 invLarvalResources 中赋值)。invLarvalResources 是一个vector<double>.
valgrind 抱怨:
==30152== Invalid write of …Run Code Online (Sandbox Code Playgroud)