小编Cra*_*urg的帖子

git diff重命名文件

我有一个文件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.有吗?

git diff rename

99
推荐指数
3
解决办法
2万
查看次数

-rpath和-L有什么区别?

gccld提供了许多方法来指定库的搜索路径 - 其中包括-rpath-L标志.这些联机帮助页显示这两个标志之间没有差异,有效地说每个标志都会向库搜索路径添加一个库.但两个旗帜完全相同的事情似乎很奇怪.这两个选项之间有什么区别?

linker gcc shared-libraries ld

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

std :: function的性能开销是多少?

我在论坛上听到使用std::function<>原因性能下降.这是真的吗?如果是真的,这是一个很大的性能下降?

c++ boost std

61
推荐指数
4
解决办法
3万
查看次数

平均案例和摊销分析之间的差异

我正在阅读一篇关于算法的摊销分析的文章.以下是文本摘要.

摊销分析与平均案例分析类似,因为它涉及一系列操作的平均成本.但是,平均案例分析依赖于有关数据结构和操作的概率假设,以便计算算法的预期运行时间.因此,它的适用性取决于关于算法输入的概率分布的某些假设.

平均情况限制并不排除即使输入概率分布的假设有效,人们也会"不幸"并遇到需要超过预期时间的输入的可能性.

我对上述文字片段的疑问是:

  1. 在第一段中,平均案例分析如何"依赖于关于数据结构和操作的概率假设?"我知道平均案例分析取决于输入概率,但上述陈述意味着什么?

  2. 作者在第二段中的意思是,即使输入分布有效,平均情况也无效?

谢谢!

algorithm analysis

40
推荐指数
3
解决办法
2万
查看次数

如何从实现Drop trait的结构中移出一个字段?

这是一个无效的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

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

如何选择不运行doc测试?

我正在写一个Rust库,我想在我的文档中提供一些示例

  1. 编译作为运行的一部分 cargo test
  2. 不会运行.

这可能吗?

我正在编写一个数据库客户端库,这些示例使用了一个假设的,不存在的数据库服务器.因此,示例在运行时总是会失败,但重要的是示例在语法上是有效的.因此我的要求如上.

如果没有办法做我想做的事,那么如何选择不cargo test运行特定的文档测试?即,cargo run编译并运行一些文档测试但完全忽略其他一些?

rust rust-cargo

20
推荐指数
2
解决办法
2532
查看次数

为什么C++ 11不能将不可复制的仿函数移动到std :: function?

//------------------------------------------------------------------------------
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.

c++ lambda function c++11

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

在Linux和BSD中使用和不使用shebang执行Bash脚本执行

当一个类似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 …

linux bash shell freebsd dash-shell

17
推荐指数
2
解决办法
4069
查看次数

关于weak_ptr的线程安全性

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)

c++ multithreading weak-ptr c++11

15
推荐指数
3
解决办法
7941
查看次数

何时使用AsRef或其他转换特性为类似字符串的类型

我在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吗?

rust

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