小编ena*_*naJ的帖子

克隆Arc时会发生什么?

我正在学习并发性,并希望澄清我对Rust书中以下代码示例的理解.如果我错了,请纠正我.

use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;

fn main() {
    let data = Arc::new(Mutex::new(vec![1, 2, 3]));

    for i in 0..3 {
        let data = data.clone();
        thread::spawn(move || {
            let mut data = data.lock().unwrap();
            data[0] += i;
        });
    }

    thread::sleep(Duration::from_millis(50));
}
Run Code Online (Sandbox Code Playgroud)

线路上发生了let data = data.clone()什么?

Rust书说

我们clone()用来创建一个新拥有的句柄.然后将此句柄移动到新线程中.

什么是新的"拥有的手柄"?这听起来像是对数据的引用?

由于clonea &self和a 返回一个Self,是每个线程修改原始数据而不是副本?我猜这就是为什么代码没有使用data.copy()data.clone()在这里.

data右侧是一个参考,而data左边是一个拥有价值.这里有一个变量阴影.

concurrency clone rust

21
推荐指数
3
解决办法
845
查看次数

在R中定义函数内部函数的好方法

在R中,当想要在另一个函数中使用一个/多个函数时,可能有两种方法.示例函数可以是:

方法1:

make.power <- function(n) {
 pow <- function(x) {
 x^n
 }
 pow
}
Run Code Online (Sandbox Code Playgroud)

方法2:

make.power <- function(n) {
     pow(n)
    }

pow <- function(x) {
     x^n
     }
Run Code Online (Sandbox Code Playgroud)

在我看来(但我不确定),第二种方法是一种更好的方法,如果你有很多子功能.

我的问题是: 1)这两种方式之间是否存在功能差异?例如,函数如何传递变量,或者子函数与父函数之间的关系等.

2)对于R,哪一个可能是优选的(可能更有计算效率或结构清晰)?

r function

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

在使用 Python 读取 csv 时指定换行符('\n')

我想使用 Python 3 读取每行由换行符 ('\n') 指示的 csv 文件。这是我的代码:

import csv
with open(input_data.csv, newline ='\n') as f:
        csvread = csv.reader(f)
        batch_data = [line for line in csvread]
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了错误:

batch_data = [line for line in csvread].
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
Run Code Online (Sandbox Code Playgroud)

阅读这些帖子:CSV new-line character seen in unquoted field error,也尝试了我能想到的这些替代方案:

with open(input_data.csv, 'rU', newline ='\n') as f:
        csvread = csv.reader(f)
        batch_data = [line for line in csvread]


with …
Run Code Online (Sandbox Code Playgroud)

python csv python-3.x

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

理解特征实现上下文中的"self"参数

在实现特征时,我们经常使用关键字self,样本如下.我想了解self此代码示例中许多用法的表示.

struct Circle {
    x: f64,
    y: f64,
    radius: f64,
}

trait HasArea {
    fn area(&self) -> f64;          // first self: &self is equivalent to &HasArea
}

impl HasArea for Circle {
    fn area(&self) -> f64 {         //second self: &self is equivalent to &Circle
        std::f64::consts::PI * (self.radius * self.radius) // third:self
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是:

  1. 第一个self:&self相当于&HasArea.
  2. 第二种self:&self相当于&Circle.
  3. self三个代表Circle?如果是这样,如果self.radius使用了两次,会导致移动问题吗?

此外, …

self traits rust

4
推荐指数
2
解决办法
254
查看次数

矢量存储Rust中混合的数据类型

在使用Shunting-yard算法将中缀表达式转换为后缀表达式的上下文中.我想使用向量来存储输出,它将存储运算符和数值类型数据.

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Operator {
    Add,
    Sub,
    Mul,
    Div,
}

fn main() {
    let mut output: Vec<String> = Vec::new();  // create an output vector
    let a = 2;
    let b = Operator::Add;
    let c = 3;
    output.push(a.to_string());
    output.push(b.to_string());
    output.push(c.to_string());
}
Run Code Online (Sandbox Code Playgroud)

上面的代码当然不能编译,因为to_string()没有定义方法Operator.我看到两种解决方法:

  1. 定义一个to_string()方法
  2. 创建一个向量来存储对数字的引用Operator.

我认为第二个是首选,但我不知道创建引用向量是否会引入很多复杂性.

vector type-conversion rust

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

let-rebinding和标准赋值之间有什么区别?

拉斯特,为了改变一个可变变量的值,是什么在差let x = 12x = 12在以下示例代码?

fn main() {
    let mut x: i32 = 8;
    {
        println!("{}", x); 
        let x = 12;  // what if change to x = 12
        println!("{}", x); 
    }
    println!("{}", x); 
    let x =  42;
    println!("{}", x); 
}
Run Code Online (Sandbox Code Playgroud)

输出是8, 12, 8, 42.如果我let x = 12改为x = 12......

fn main() {
    let mut x: i32 = 8;
    {
        println!("{}", x); 
        x = 12; 
        println!("{}", x); 
    }
    println!("{}", …
Run Code Online (Sandbox Code Playgroud)

binding scope rust

3
推荐指数
1
解决办法
178
查看次数

Python 3:未使用 os.path.isfile 函数识别现有文件

我在目录中有一个文件 7.csv:~/Documents/Jane/analyst/test/1/。我能够使用 pandas.read_csv 函数读取这个文件,没有问题。

f_path = '~/Documents/Jane/analyst/test/1/7.csv'

pd.read_csv(f_path, index_col=None, header=0)
Run Code Online (Sandbox Code Playgroud)

但是当使用 os.path.isfile() 检查此文件是否存在时,结果返回 False。

os.path.isfile(f_path)

False
Run Code Online (Sandbox Code Playgroud)

可能的错误来源是什么?

python filepath

2
推荐指数
1
解决办法
1206
查看次数

使用引用匹配结构

为了在阻止移动时匹配结构,我想使用引用来进行匹配.所以下面的代码将完成这项工作:

struct Foo(i32);

fn main() {
    let x = Foo(1);
    match &x {
        ref a => println!("hello"),
    }
    println!("{}", x.0);
}
Run Code Online (Sandbox Code Playgroud)

但我很惊讶地发现以下代码也有效,它实际上将struct(x)与reference(ref a)匹配.但是,这不应该是类型不匹配吗?

struct Foo(i32);

fn main() {
    let x = Foo(1);
    match x {
        ref a => println!("hello")
    }
    println!("{}", x.0);
}
Run Code Online (Sandbox Code Playgroud)

match rust

2
推荐指数
1
解决办法
439
查看次数

为什么在模式匹配后不会移动此结构?

基于在模式匹配期间防止移动语义,我的理解是当我match对结构进行操作时,如果不使用引用来进行匹配,则结构将被移动,因为它不是基本类型.为了测试这个,我实现了以下内容:

struct Point {
    x: i32,
    y: i32,
}

let origin = Point { x: 0, y: 0 };

match origin {
    Point { x: x1, y: y1 } => println!("({},{})", x1, y1),
}

// to check if the origin has been moved, and it seems not, why ?? 
match origin {
    Point { x: x1, y: y1 } => println!("({},{})", x1, y1),
}
Run Code Online (Sandbox Code Playgroud)

输出是(0,0) (0,0),这意味着原始结构仍然存在.它不应该在第一次之后被移动match吗?

move pattern-matching rust

2
推荐指数
1
解决办法
218
查看次数

什么时候在Rust通用函数中将输入作为T或&T?

我的课堂笔记有代码实现HasArea特征并打印区域,类似于Rust Book示例.教授的笔记如下:

trait HasArea<T> {
    fn area(& self) -> T,
}

fn print<T: Display, S: HasArea<T>>(s: &S) {
    println!("", s.area());  // println sth must impl Display trait
}

struct Circle {
    x: T,
    y: T,
    r: T,
}

impl <T: Copy + Mul <Output = T>>
    HasArea<T> for Circle<T>  
{
    fn area(&self) -> T {
        self.r * self.r
    }
}
Run Code Online (Sandbox Code Playgroud)

将其与shape: T作为输入的Rust Book进行比较:

trait HasArea {
    fn area(&self) -> f64;
}

struct Circle {
    x: f64, …
Run Code Online (Sandbox Code Playgroud)

generics rust

2
推荐指数
1
解决办法
314
查看次数