我有一个文件a.txt.
cat a.txt
> hello
Run Code Online (Sandbox Code Playgroud)
内容a.txt是"你好".
我做了一个提交.
git add a.txt
git commit -m "first commit"
Run Code Online (Sandbox Code Playgroud)
然后我a.txt进入了一个test目录.
mkdir test
mv a.txt test
Run Code Online (Sandbox Code Playgroud)
然后我做了第二次提交.
git add -A
git commit -m "second commit"
Run Code Online (Sandbox Code Playgroud)
最后,我编辑a.txt说"再见".
cat a.txt
> goodbye
Run Code Online (Sandbox Code Playgroud)
我做了最后一次提交.
git add a.txt
git commit -m "final commit"
Run Code Online (Sandbox Code Playgroud)
现在这是我的问题:
如何区分a.txt上次提交和第一次提交之间的内容?
我试过了
git diff HEAD^^..HEAD -M a.txt,但是那没用. git log --follow a.txt正确检测重命名,但我找不到相应的git diff.有吗?
gcc并ld提供了许多方法来指定库的搜索路径 - 其中包括-rpath和-L标志.这些联机帮助页显示这两个标志之间没有差异,有效地说每个标志都会向库搜索路径添加一个库.但两个旗帜完全相同的事情似乎很奇怪.这两个选项之间有什么区别?
我在论坛上听到使用std::function<>原因性能下降.这是真的吗?如果是真的,这是一个很大的性能下降?
我正在阅读一篇关于算法的摊销分析的文章.以下是文本摘要.
摊销分析与平均案例分析类似,因为它涉及一系列操作的平均成本.但是,平均案例分析依赖于有关数据结构和操作的概率假设,以便计算算法的预期运行时间.因此,它的适用性取决于关于算法输入的概率分布的某些假设.
平均情况限制并不排除即使输入概率分布的假设有效,人们也会"不幸"并遇到需要超过预期时间的输入的可能性.
我对上述文字片段的疑问是:
在第一段中,平均案例分析如何"依赖于关于数据结构和操作的概率假设?"我知道平均案例分析取决于输入概率,但上述陈述意味着什么?
作者在第二段中的意思是,即使输入分布有效,平均情况也无效?
谢谢!
这是一个无效的Rust程序(Rust版本1.1),其中包含一个执行HTTP客户端请求的函数,只返回标题,删除响应中的所有其他字段.
extern crate hyper;
fn just_the_headers() -> Result<hyper::header::Headers, hyper::error::Error> {
let c = hyper::client::Client::new();
let result = c.get("http://www.example.com").send();
match result {
Err(e) => Err(e),
Ok(response) => Ok(response.headers),
}
}
fn main() {
println!("{:?}", just_the_headers());
}
Run Code Online (Sandbox Code Playgroud)
以下是编译器错误:
main.rs:8:28: 8:44 error: cannot move out of type `hyper::client::response::Response`, which defines the `Drop` trait
main.rs:8 Ok(response) => Ok(response.headers),
^~~~~~~~~~~~~~~~
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
我理解为什么借用检查器不接受这个程序 - 即,该drop函数将response在其headers成员被移动之后使用它.
我的问题是:我怎样才能解决这个问题并且仍然拥有安全的Rust代码?我知道我可以复制,通过clone(),像这样:
Ok(response) => Ok(response.headers.clone()), …Run Code Online (Sandbox Code Playgroud) 我正在写一个Rust库,我想在我的文档中提供一些示例
cargo test这可能吗?
我正在编写一个数据库客户端库,这些示例使用了一个假设的,不存在的数据库服务器.因此,示例在运行时总是会失败,但重要的是示例在语法上是有效的.因此我的要求如上.
如果没有办法做我想做的事,那么如何选择不cargo test运行特定的文档测试?即,cargo run编译并运行一些文档测试但完全忽略其他一些?
//------------------------------------------------------------------------------
struct A
{
A(){}
A(A&&){}
A& operator=(A&&){return *this;}
void operator()(){}
private:
A(const A&);
A& operator=(const A&);
int x;
};
//------------------------------------------------------------------------------
int main()
{
A a;
std::function<void()> func(std::move(a));
}
Run Code Online (Sandbox Code Playgroud)
'A :: A':无法访问类'A'中声明的私有成员
似乎当我通过引用捕获某些东西时,或者const我可以制作一个不可复制的lambda.但是,当我这样做时,它实际上是为了给它一个std::function.
当一个类似Bash的脚本作为没有shebang的二进制文件执行时,如何以及由谁决定执行什么?
我想用 shebang 运行一个普通的脚本是用binfmt_script Linux模块处理的,它检查一个shebang,parses命令行并运行指定的脚本解释器.
但是当有人在没有shebang的情况下运行脚本时会发生什么?我已经测试了直接execv方法并发现那里没有内核魔法 - 即像这样的文件:
$ cat target-script
echo Hello
echo "bash: $BASH_VERSION"
echo "zsh: $ZSH_VERSION"
Run Code Online (Sandbox Code Playgroud)
运行仅执行execv调用的已编译C程序会产生:
$ cat test-runner.c
void main() {
if (execv("./target-script", 0) == -1)
perror();
}
$ ./test-runner
./target-script: Exec format error
但是,如果我从另一个shell脚本执行相同的操作,它将使用与原始shell脚本相同的shell解释器运行目标脚本:
$ cat test-runner.bash #!/bin/bash ./target-script $ ./test-runner.bash Hello bash: 4.1.0(1)-release zsh:
如果我使用其他shell执行相同的技巧(例如,Debian的默认值sh- /bin/dash),它也可以:
$ cat test-runner.dash #!/bin/dash ./target-script $ ./test-runner.dash Hello bash: zsh:
神秘的是,它与zsh没有达到预期的效果,并且不遵循一般方案./bin/sh毕竟看起来像zsh 在这些文件上执行:
greycat@burrow-debian ~/z/test-runner …
std::shared_ptr<int> g_s = std::make_shared<int>(1);
void f1()
{
std::shared_ptr<int>l_s1 = g_s; // read g_s
}
void f2()
{
std::shared_ptr<int> l_s2 = std::make_shared<int>(3);
std::thread th(f1);
th.detach();
g_s = l_s2; // write g_s
}
Run Code Online (Sandbox Code Playgroud)
关于上面的代码,我知道不同的线程读取和写入相同的shared_ptr导致竞争条件.但是怎么样weak_ptr?下面的代码中是否有竞争条件?(我的平台是Microsoft VS2013.)
std::weak_ptr<int> g_w;
void f3()
{
std::shared_ptr<int>l_s3 = g_w.lock(); //2. here will read g_w
if (l_s3)
{
;/.....
}
}
void f4()
{
std::shared_ptr<int> p_s = std::make_shared<int>(1);
g_w = p_s;
std::thread th(f3);
th.detach();
// 1. p_s destory will motify g_w (write g_w)
}
Run Code Online (Sandbox Code Playgroud) 我在Rust stable中定义了一个crate API(截至目前为1.2版),并且对于定义我自己的类似字符串的类型的最佳实践感到困惑.
例如,我有一个Foo包装字符串的类型.
pub struct Foo(String);
Run Code Online (Sandbox Code Playgroud)
我的API隐藏了Foo实例的构造,而且,因为元组字段是私有的,所以应用程序不能错误地Foo为自己构造无效值.这意味着我的API限制应用程序仅使用有效值Foo.到现在为止还挺好.
但是,我希望应用程序能够使用一个Foo实例,就好像它是一个字符串 - 说,打印它,记录它,将它写入文件,将其传递给接受的第三方包,&str通过构造副本to_string()和变异简而言之,我希望应用程序能够"抛弃" Foo-ness并使用对底层字符串的引用.由于应用程序无法将原始字符串转换回Foo实例,因此保留了类型安全性.
我的问题是:我的crate应该实现什么转换特性,Foo以允许应用程序"抛弃" Foo-ness并使用底层字符串作为原始字符串?Foo转换为&str非常重要,以避免对底层字符串进行任何不必要的复制.
例如,怎么样?
impl AsRef<str> for Foo
Run Code Online (Sandbox Code Playgroud)
这是正确的做法吗?是否足以成为惯用语?我应该考虑实施其他转换特性Foo吗?