标签: mutability

Swift make方法参数是否可变?

如何在不创建其他变量的情况下处理此错误?

func reduceToZero(x:Int) -> Int {
    while (x != 0) {
        x = x-1            // ERROR: cannot assign to 'let' value 'x'
    }
    return x
}
Run Code Online (Sandbox Code Playgroud)

我不想创建额外的变量来存储x的值.甚至可以做我想做的事情吗?

syntax immutability mutability swift

106
推荐指数
6
解决办法
5万
查看次数

我如何在moment.js中解决可变性问题?

我遇到了一个问题,我必须存储一个时刻对象的初始值,但是我遇到了一些问题,我阻止了我的变量与原始对象一起变化.

不幸的是,Object.freeze()不起作用,因为当我尝试格式化时,moment.js返回"无效日期"错误.

javascript object immutability mutability momentjs

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

Python字符串不是不可变的吗?那为什么+""+ b有效呢?

我的理解是Python字符串是不可变的.

我尝试了以下代码:

a = "Dog"
b = "eats"
c = "treats"

print a, b, c
# Dog eats treats

print a + " " + b + " " + c
# Dog eats treats

print a
# Dog

a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!
Run Code Online (Sandbox Code Playgroud)

Python不应该阻止这项任务吗?我可能错过了一些东西.

任何的想法?

python string immutability mutability

95
推荐指数
9
解决办法
11万
查看次数

Google Go语言中哪些类型是可变的和不可变的?

在Google Go中,我读到字符串是不可变的,好吧但是是int?其他类型呢?作为一个稍微老一点的程序员,我更喜欢可变性,即使我知道不变性的好处,我更喜欢生活危险.

知道哪些类型是可变的或不可变的将是非常有帮助的.


更新,我最关心的是实际问题取决于类型是可变的还是不可变的.与Java中的典型示例一样,如果在循环中创建一个String并循环10,000次,则将创建10,000个String,然后进行垃圾回收.在我工作的公司的项目中,这实际上是一个严重的问题.

问题是,Go的不变性在某些情况下会导致同样的问题吗?

它会影响你应该如何对待var.(或者我认为它确实如此).


再次更新,我也关注其他实际问题.知道某些东西是不可变的意味着我可以编写并行的代码,并且对该对象的一个​​引用的更新不应该更新其他引用.但有时候我想做危险的事情,我想要变性.

这些是可变性与不变性的结果,并影响我如何编写代码.

immutability go mutability

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

如何从一个范围创建一个Vec并将其洗牌?

我有以下代码:

extern crate rand;

use rand::{thread_rng, Rng};

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    let mut slice: &[u32] = vec.as_mut_slice();

    thread_rng().shuffle(slice);
}
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

error[E0308]: mismatched types
 --> src/main.rs:9:26
  |
9 |     thread_rng().shuffle(slice);
  |                          ^^^^^ types differ in mutability
  |
  = note: expected type `&mut [_]`
             found type `&[u32]`
Run Code Online (Sandbox Code Playgroud)

我想我明白向量和切片的内容是不可变的,这会导致错误,但我不确定.

签名as_mut_slicepub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T],所以切片应该是可变的,但它不知何故.

我知道必须有一个简单的解决办法,但我尽我所能,无法让它发挥作用.

iterator immutability mutability rust

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

使就地操作返回对象是一个坏主意吗?

我在这里主要谈论Python,但我想这可能适用于大多数语言.如果我有一个可变对象,那么进行就地操作也是一个坏主意还会返回该对象吗?似乎大多数示例只是修改对象并返回None.例如,list.sort.

python coding-style mutable mutability

24
推荐指数
2
解决办法
2415
查看次数

如何在不破坏封装的情况下返回对RefCell内部内容的引用?

我有一个内部可变性的结构.

use std::cell::RefCell;

struct MutableInterior {
    hide_me: i32,
    vec: Vec<i32>,
}
struct Foo {
    //although not used in this particular snippet,
    //the motivating problem uses interior mutability
    //via RefCell.
    interior: RefCell<MutableInterior>,
}

impl Foo {
    pub fn get_items(&self) -> &Vec<i32> {
        &self.interior.borrow().vec
    }
}

fn main() {
    let f = Foo {
        interior: RefCell::new(MutableInterior {
            vec: Vec::new(),
            hide_me: 2,
        }),
    };
    let borrowed_f = &f;
    let items = borrowed_f.get_items();
}
Run Code Online (Sandbox Code Playgroud)

产生错误:

error[E0597]: borrowed value does not live long enough
  --> …
Run Code Online (Sandbox Code Playgroud)

encapsulation contravariance mutability rust interior-mutability

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

如何遍历Hashmap,打印键/值并删除Rust中的值?

这在任何语言中都应该是一项微不足道的任务.这不适用于Rust.

use std::collections::HashMap;

fn do_it(map: &mut HashMap<String, String>) {
    for (key, value) in map {
        println!("{} / {}", key, value);
        map.remove(key);
    }
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

这是编译器错误:

error[E0382]: use of moved value: `*map`
 --> src/main.rs:6:9
  |
4 |     for (key, value) in map {
  |                         --- value moved here
5 |         println!("{} / {}", key, value);
6 |         map.remove(key);
  |         ^^^ value used here after move
  |
  = note: move occurs because `map` has type `&mut std::collections::HashMap<std::string::String, std::string::String>`, which does …
Run Code Online (Sandbox Code Playgroud)

iteration hashmap mutability rust

18
推荐指数
3
解决办法
9149
查看次数

Scala:可变对象与不可变对象性能 - OutOfMemoryError

我想比较Scala中的immutable.Map和mutable.Map的性能特征,以进行类似的操作(即将许多映射合并为一个映射.请参阅此问题).我有可变和不可变映射的类似实现(见下文).

作为测试,我生成了一个包含1,000,000单项Map [Int,Int]的List,并将此列表传递给我正在测试的函数.有了足够的内存,结果就不足为奇了:对于mutable.Map来说是~1200ms,对于immutable.Map来说是~1800ms,对于使用mutable.Map的命令式实现来说是~750ms - 不知道是什么导致了那里的巨大差异,但是随意对此也有评论.

让我感到惊讶的是,也许是因为我有点厚,是因为IntelliJ 8.1中的默认运行配置,两个可变实现都遇到了OutOfMemoryError,但是不可变集合没有.不可变测试确实完成了,但它的速度非常慢 - 大约需要28秒.当我增加最大JVM内存(大约200MB,不确定阈值在哪里)时,我得到了上面的结果.

无论如何,这是我真正想知道的:

为什么可变实现耗尽内存,但不可变实现却没有? 我怀疑不可变版本允许垃圾收集器在可变实现之前运行并释放内存 - 并且所有这些垃圾收集都解释了不可变低内存运行的缓慢 - 但我想要更详细的解释比起那个来说.

以下实施.(注意:我并未声称这些是可能的最佳实现.请随意提出改进建议.)

  def mergeMaps[A,B](func: (B,B) => B)(listOfMaps: List[Map[A,B]]): Map[A,B] =
    (Map[A,B]() /: (for (m <- listOfMaps; kv <-m) yield kv)) { (acc, kv) =>
      acc + (if (acc.contains(kv._1)) kv._1 -> func(acc(kv._1), kv._2) else kv)
    }

  def mergeMutableMaps[A,B](func: (B,B) => B)(listOfMaps: List[mutable.Map[A,B]]): mutable.Map[A,B] =
    (mutable.Map[A,B]() /: (for (m <- listOfMaps; kv <- m) yield kv)) { (acc, kv) =>
      acc + (if (acc.contains(kv._1)) kv._1 …
Run Code Online (Sandbox Code Playgroud)

memory performance garbage-collection scala mutability

16
推荐指数
1
解决办法
7161
查看次数

不能将`self.x`借用为不可变因为`*self`也被借用为可变的

首先,让代码说:

#[derive(Debug)]
struct Bar;

#[derive(Debug)]
struct Qux {
    baz: bool
}

#[derive(Debug)]
struct Foo {
    bars: Vec<Bar>,
    qux: Qux,
}

impl Foo {
    fn get_qux(&mut self) -> &mut Qux {
        &mut self.qux
    }

    fn run(&mut self) {
        // 1. Fails:
        let mut qux = self.get_qux();

        // 2. Works:
        // let mut qux = &mut Qux { baz: false };

        // 3. Works:
        // let mut qux = &mut self.qux;

        let qux_mut = &mut qux;
        qux_mut.baz = true;

        for bar in …
Run Code Online (Sandbox Code Playgroud)

immutability mutability rust

15
推荐指数
1
解决办法
5301
查看次数