标签: mutable

Ruby中的字符串是否可变?

请考虑以下代码:

$ irb
> s = "asd"
> s.object_id   # prints 2171223360
> s[0] = ?z     # s is now "zsd"
> s.object_id   # prints 2171223360 (same as before)
> s += "hello"  # s is now "zsdhello"
> s.object_id   # prints 2171224560 (now it's different)
Run Code Online (Sandbox Code Playgroud)

似乎可以在不创建新字符串的情况下更改单个字符.但是,附加到字符串显然会创建一个新字符串.

Ruby中的字符串是否可变?

ruby string mutable immutability

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

Python中的可变字符串

请问,你知道一个提供可变字符串的Python库吗?谷歌的结果令人惊讶地回归.我找到的唯一可用的库是http://code.google.com/p/gapbuffer/,它在C中,但我更喜欢用纯Python编写.

编辑:感谢您的回复,但我正在追求一个高效的库.也就是说,''.join(list)可能有用,但我希望有更优化的东西.此外,它必须支持常规字符串常用的东西,如正则表达式和unicode.

python string mutable

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

Ruby中的字符串是否可变?

字符串在Ruby中是否可变?根据文件

str = "hello"
str = str + " world"
Run Code Online (Sandbox Code Playgroud)

使用值创建一个新的字符串对象,"hello world"但是当我们这样做时

str = "hello"
str << " world"
Run Code Online (Sandbox Code Playgroud)

它没有提到它创建了一个新对象,它是否会改变str对象,现在它将具有值"hello world"

ruby string mutable immutability

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

在Kotlin中,如何在迭代时修改列表的内容

我有一个清单:

val someList = listOf(1, 20, 10, 55, 30, 22, 11, 0, 99)
Run Code Online (Sandbox Code Playgroud)

我想在修改一些值时迭代它.我知道我可以这样做,map但是它会复制一份清单.

val copyOfList = someList.map { if (it <= 20) it + 20 else it }
Run Code Online (Sandbox Code Playgroud)

如果没有副本我该怎么办?

注意: 这个问题是由作者故意编写和回答的(答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.

iterator list mutable kotlin

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

将volatile关键字与可变对象一起使用

在Java中,我理解volatile关键字提供变量的可见性.问题是,如果变量是对可变对象的引用,那么volatile还是为该对象内的成员提供了可见性吗?

在下面的示例中,如果多个线程正在访问volatile Mutable m并更改value?,它是否正常工作?

class Mutable {
    private int value;
    public int get()
    {
        return a;
    }
    public int set(int value)
    {
        this.value = value;
    }
}

class Test {
    public volatile Mutable m;
}
Run Code Online (Sandbox Code Playgroud)

java concurrency mutable volatile

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

什么是C#的"大部分完整"(im)可变性方法?

由于尽管在CLR中有一些支持,但不变性并没有完全融入C#到F#的程度,或完全进入框架(BCL),对于C#的(im)可变性有什么相当完整的解决方案?

我的偏好顺序是一个由兼容的一般模式/原则组成的解决方案

  • 一个只有很少依赖的开源库
  • 少量互补/兼容的开源库
  • 商业广告

  • 涵盖Lippert的各种不变性
  • 提供了不错的表现(我知道这很模糊)
  • 支持序列化
  • 支持克隆/复制(深/浅/部分?)
  • 在DDD,构建器模式,配置和线程等场景中感觉很自然
  • 提供不可变的集合

我还希望包含您作为社区可能提出的模式,这些模式不完全适合框架,例如通过接口表达可变性意图(其中两个客户端不应该更改某些内容并且可能只想更改某些内容通过接口这样做,而不是支持类(是的,我知道这不是真正的不变性,但足够):

public interface IX
{
    int Y{ get; }
    ReadOnlyCollection<string> Z { get; }
    IMutableX Clone();
}

public interface IMutableX: IX
{
    new int Y{ get; set; }
    new ICollection<string> Z{ get; } // or IList<string>
}

// generally no one should get ahold of an X directly
internal class X: IMutableX
{
    public int Y{ get; set; }

    ICollection<string> IMutableX.Z …
Run Code Online (Sandbox Code Playgroud)

.net c# mutable immutability

30
推荐指数
2
解决办法
640
查看次数

为什么"可变的默认参数修复"语法如此丑陋,请问python newbie

现在跟随我的一系列"python新手问题"并基于另一个问题.

特权

转到http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables并向下滚动到"默认参数值".在那里你可以找到以下内容:

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list
Run Code Online (Sandbox Code Playgroud)

在python.org上甚至还有一个"重要的警告",这个例子非常相同,并不是说它"更好".

一种方式来表达它

所以,这里的问题是:为什么在一个已知问题上"好"语法比在一个促进"优雅语法"和"易于使用"的编程语言中那样丑陋?

编辑:

另一种说法

我不是在问为什么或如何发生(感谢Mark的链接).

我问为什么没有更简单的替代内置语言.

我认为更好的方法可能是在def自身中做一些事情,其中name参数将附加到def可变对象中的"本地"或"新" .就像是:

def better_append(new_item, a_list=immutable([])):
    a_list.append(new_item)
    return a_list
Run Code Online (Sandbox Code Playgroud)

我相信有人可以提供更好的语法,但我也猜测必须有一个非常好的解释为什么没有这样做.

python mutable names

28
推荐指数
3
解决办法
2303
查看次数

Clojure可变存储类型

我正在尝试从网站上提供的API和文档中学习Clojure.我对Clojure中的可变存储有点不清楚,我想确保我的理解是正确的.如果有任何想法我错了,请告诉我.

编辑:我正在更新这个,因为我收到有关其正确性的评论.


免责声明:所有这些信息都是非正式的,可能是错误的.不要使用这篇文章来了解Clojure的工作原理.


Vars总是包含根绑定,可能还包含每个线程的绑定.它们与命令式语言中的常规变量相当,不适合在线程之间共享信息.(感谢Arthur Ulfeldt)

Refs是支持原子事务的线程之间共享的位置,可以更改单个事务中任意数量的ref的状态.在退出同步表达式(dosync)时提交事务,并且使用STM魔法(回滚,队列,等待等)自动解决冲突

代理是通过调度独立的操作函数来更改代理的状态,使得线程之间异步共享信息的位置,而开销最小.虽然在调度函数完成之前未设置代理程序的值,但代理程序会立即返回并因此是非阻塞的.

原子是可以在线程之间同步共享的位置.它们支持不同线程之间的安全操作.

这是我基于何时使用这些结构的友好总结:

  • Vars就像命令式语言中的常规旧变量.(尽可能避免)
  • 原子就像Vars一样,但具有线程共享安全性,可以立即读取和安全设置.(谢谢马丁)
  • 代理就像一个Atom,但它不是阻塞它而是产生一个新的线程来计算它的值,只有在改变一个值时才会阻塞,并且可以让其他线程知道它已经完成了分配.
  • Refs是在事务中锁定自己的共享位置.我们只是启动一个事务并让Clojure处理该事务中refs之间的所有锁定条件,而不是让程序员决定在每个锁定代码的竞争条件下会发生什么.

此外,相关概念是功能future.对我来说,似乎未来的对象可以被描述为同步代理,在完成计算之前根本无法访问该值.它也可以描述为非阻塞Atom.这些准确的未来概念是什么?

multithreading future clojure mutable

27
推荐指数
1
解决办法
3092
查看次数

如何在Haskell中实现可变数组?

我已经阅读了很多关于这个主题的研究论文,他们通常认为数组是使用Monads实现的.但是这些论文都没有明确定义如何定义"类型"数组本身,它们只给出了使用monads访问或修改此类型的函数的定义.在Haskell中实现的数组如何有O(1)时间来访问或修改索引元素?(例如STUArray和MArray)

arrays monads state haskell mutable

27
推荐指数
3
解决办法
4527
查看次数

将资源加载到可变位图

我正在从像这样的资源加载位图:

 Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
Run Code Online (Sandbox Code Playgroud)

我想要做的是在我的绘制方法中将它绘制到主画布之前对位图进行一些更改(因为当它不会改变时,在我的主循环中重复大量绘制似乎很浪费).我正在使用以下内容对位图进行更改:

Canvas c = new Canvas(mBackground);
c.drawARGB(...); // etc
Run Code Online (Sandbox Code Playgroud)

所以我自然会得到一个例外

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
Run Code Online (Sandbox Code Playgroud)

所以为了避免这种情况,我制作了位图的副本,以便它是可变的

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
Run Code Online (Sandbox Code Playgroud)

哪个避免了问题,但它有时会导致OutOfMemoryExceptions,知道更好的方法来实现我想要的东西吗?

android bitmap mutable out-of-memory android-canvas

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