问题标签 [mutable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
13162 浏览

objective-c - 关于 NSStrings 的最后一句话:可变和不可变

我读过几本书......和在线......关于不可变和可变字符串。他们声称“不可变字符串”无法更改。(但他们从不定义“改变”。)

哪些 NSString 可以在不使用 NSMutableString 的情况下进行更改?

该字符串包含“catfish”......我后来尝试将其更改为“cat”。(相同的字母,只是更短。)

它包含“猫”......我尝试将其更改为“鲶鱼”。(类似的开始......但只是变长了。)

我把“猫”改成“猫”。(相同的字母,但只是大小写发生了变化。)

我把“猫”变成了“狗”。(完全不同的字符串,但长度相同。)

我把“猫”改成了“山茱萸”。(完全不同的字符串,但更长。)

0 投票
3 回答
1214 浏览

oop - 基本 F# 问题:可变性、大小写标准、函数与方法

如果已经问过这些,请随时向我指出其他答案!

我只是在本月的新版本中开始使用 F#。我在 OO 和函数式语言(Haskell 和 Scheme,但不是 OCaml/ML)方面都有一些背景。到目前为止,在阅读 F# CTP 附带的小教程时,已经出现了几个问题。

1)可变变量比单子更受欢迎吗?如果是这样,在 F# 中是否完全避开了 monad?

2)我对使用的大写有点困惑。在本教程代码文件中,有时函数以小写字母开头,有时以大写字母开头。我知道 MS 倾向于喜欢带有函数和方法的初始上限,但在这里似乎有两种方法可以做到这一点。这对我来说没什么大不了的,因为我只是在自己的时间里玩耍,但我很好奇标准是什么。

3) 我对面向对象和功能样式的整个组合感到很困惑。print_string "string"有道理,但是这里是List.map fn list(除非 List 只是名称空间,如果是,请原谅我)。那么这里是str.Length。任何人都关心阐明何时使用什么,哪个是首选?

谢谢!

0 投票
3 回答
4997 浏览

f# - 如何返回多个值并将它们分配给可变变量?

这就是我到目前为止所拥有的。

0 投票
1 回答
399 浏览

c# - C# 为某些属性昂贵的对象设计:让它可变的借口?

是的,我知道,关于可变对象的另一个问题。有关一般背景的信息,参阅内容,与我的问题最接近的类似内容请参见此内容。(尽管它有一些不适用于此处的 C++ 特定泛音)

让我们假设下面的伪代码代表了最好的界面设计。也就是说,它是业务语义(就目前而言)到 OO 类型的最清晰表达。自然地,UglyData 和我们使用它来做的事情会发生增量变化。

这里最好的路线是什么?我可以看到的选项:

  1. 具有显式 Calculate() 方法的可变对象,如上
  2. 在 getter 中完成昂贵计算的可变对象(并且可能被缓存)
  3. 拆分为两个对象,其中一个从另一个继承(或者可能是组合?)
  4. 某种静态+锁定机制,如上面链接的 C++ 问题

我自己倾向于#2。但每条路线都有潜在的陷阱。

如果您选择 #1 或 #2,那么您将如何以清晰、正确的方式实现 Consumer2 的可变循环?

如果您选择#1 或#3,您将如何处理将来只想计算某些属性而不计算其他属性的情况?愿意创建 N 个辅助方法/派生类吗?

如果您选择#4,我认为您很疯狂,但请随时解释

0 投票
5 回答
3130 浏览

multithreading - Clojure 可变存储类型

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

编辑:当我收到关于其正确性的评论时,我正在更新它。


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


Vars总是包含一个根绑定,并且可能包含一个每个线程的绑定。它们与命令式语言中的常规变量相当,不适合在线程之间共享信息。(感谢亚瑟乌尔费尔特)

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

代理是通过调度独立的动作函数来改变代理的状态,使信息能够以最小的开销在线程之间异步共享的位置。代理会立即返回,因此是非阻塞的,尽管在分派函数完成之前不会设置代理的值。

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

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

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

另外,一个相关的概念是函数future。对我来说,future 对象似乎可以被描述为一个同步代理,其中在计算完成之前根本无法访问该值。它也可以被描述为一个非阻塞的 Atom。这些是对未来的准确概念吗?

0 投票
4 回答
4896 浏览

java - Java Set 中对象的可变字段

我是否正确假设如果您有一个包含在 Java Set<> 中的对象(或作为 Map<> 中的键),任何用于确定身份或关系的字段(通过hashCode(),equals()compareTo().) 不能在不导致对集合的操作出现未指定行为的情况下进行更改?(编辑:正如在另一个问题中提到的)

(换句话说,这些字段应该是不可变的,或者您应该要求将对象从集合中删除,然后更改,然后重新插入。)

我问的原因是我正在阅读Hibernate Annotations 参考指南,它有一个示例,其中有一个HashSet<Toy>Toy该类具有字段name并且serial是可变的并且也用于hashCode()计算......我脑海中出现了一个危险信号我只是想确保我理解它的含义。

0 投票
1 回答
383 浏览

java - Hibernate中实体集合的陷阱

好的,这是这个问题的后续问题,因为我现在真的很困惑。

假设我在实体之间有一个一对多或多对多的关联,Person并且Java 中的Event一个类包含一个. (让我们忽略 Event 是否包含一个或一个。)PersonSet<Event>PersonSet<Person>

Events 是存储在数据库中的实体,因此我可以更改事件字段。处理Event可变性而不使 Java Set<> 身份检查混淆的正确方法是什么?你永远不应该覆盖hashCode()和/或equals()在这种情况下?(例如身份=基于对象引用身份)

如果我希望对Events 进行排序(例如按事件开始时间),我如何管理更改 an 的字段Event?一旦更改传播到那里,数据库就会很好地处理它,但是在 Java 方面,这是否意味着为了更改集合中的事件,我必须删除它、更改它并重新插入?或者没有真正的方法来维护 Hibernate 映射的 Java 端的排序顺序?(因此我必须将其视为无序的,因此每当我想获得Events 的排序列表时,我必须在 Java 中处理排序?)

编辑:呸,我刚刚在equals/hashCode上发现了这些讨论:

0 投票
2 回答
13135 浏览

f# - 如何将字典条目的值声明为可变的?

Google 提供了大量在 F# 字典(或其他集合)中添加和删除条目的示例。但我没有看到相当于的例子

我试过了

我也试图将字典声明为

以及这方面的几个变体。但是,我还没有找到正确的组合......如果它在 F#中实际上是可能的。

编辑:有问题的代码是:

我得到的错误是:

0 投票
3 回答
229 浏览

java - 改变一个锁对象

只是想知道(尽可能详细地),为什么在将对象用作锁时修改对象是一种不好的做法。

干杯

0 投票
5 回答
352 浏览

python - Python 对象初始化错误。还是我误解了对象的工作原理?

这将打印对分配给 和 对象的对象one._resourcesone引用two。我认为这two将是一个空数组,因为如果在创建对象时未定义它,它显然是这样设置的。取消注释myobj.__init__(self, resources)做同样的事情。使用super(ext, self).__init__(resources)也做同样的事情。

我可以让它工作的唯一方法是如果我使用以下内容:

在创建对象以使其工作时,我不必手动设置默认值。或者也许我会。有什么想法吗?

我使用 Python 2.5 和 2.6 进行了尝试。