问题标签 [mutability]

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 投票
1 回答
2160 浏览

objective-c - Is there a pattern to override a property?

The Objective-C runtime keeps a list of declared properties as meta-data with a Class object. The meta-data includes property name, type, and attributes. The runtime library also provides a couple of functions to retrieve these information. It means a declared property is more than a pair of accessor methods (getter/setter). My first question is: Why we (or the runtime) need the meta-data?

As is well known, a declared property cannot be overridden in subclasses (except readwrite vs. readonly). But I have a scenario that guarantees that needs:

Of course, the compiler won't let the above code pass through. My solution is to substitute the declared property with a pair of accessor methods (with the readonly case, just the getter):

Property string needs to be mutable because it is modified incrementally and potentially frequently. I know the constraint that methods with the same selector should share the same return and parameter types. But I think the above solution is appropriate both semantically and technically. For the semantic aspect, a mutable object is a immutable object. For the technical aspect, the compiler encodes all objects as id's. My second question is: Does the above solution make sense? Or it's just odd?

I can also take a hybrid approach, as follows:

However, when I access the property using the dot syntax like myMutableObject.string, the compiler warns that the return type of the accessor method does not match the type of the declared property. It's OK to use the message form as [myMutableObject string]. That suggests another aspect where a declared property is more than a pair of accessor methods, that is, more static type checking, although it is undesirable here. My third question is: Is it common to use getter/setter pair instead of declared property when it is intended to be overridden in subclasses?

0 投票
1 回答
1447 浏览

c - C中的常量正确性

const显然,除非某些东西是可变的,否则使用它是一个好习惯,但你能走多远?如果我有一个字符串数组,我的函数签名应该包括这个吗?

我不会对其进行任何修改,因此它是指向常量数组的第一个元素的常量指针,指向常量字符数组的第一个元素。这很拗口,而且代码几乎不可读。这一切都是一个简单的数据结构,如argv.

我觉得好像 const 应该是默认的,应该有一个 mutable 关键字。

您通常只是其中之一const吗?那么,如果您仍然可以通过或多或少地取消引用来轻松更改它,那又有什么意义呢?

0 投票
2 回答
1020 浏览

functional-programming - 什么时候可以修改函数式语言中的变量?

所以我正在使用 Racket Scheme 自学函数式编程,到目前为止我很喜欢它。作为我自己的练习,我一直在尝试以纯粹的功能方式实现一些简单的任务。我知道不变性是函数式风格的重要组成部分,但我想知道是否有任何时候可以。

我想到了一种有趣的方法,让函数在与过滤器一起使用时从字符串列表中去除非唯一字符串,如下所示:

如您所见,make-uniquer返回一个字符串列表的闭包以比较其唯一性,这样它就可以充当过滤器的简单谓词。但我正在破坏性地更新封闭列表。这是不好的形式,还是可以以这种方式更改局部封闭变量?

0 投票
4 回答
3328 浏览

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

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

0 投票
1 回答
78 浏览

python - python - class mutability

I got the code below from an exam and I don't understand why the first time when you make f2 = f1, doing f1.set() changes f2 but after that when you set f1 = Foo("Nine", "Ten") doesn't change f2 at all. If anyone knows why please explain it to me. Thank you so much!

Code:

Outcome:

0 投票
4 回答
280 浏览

python - 为什么子列表在 for 循环中是可变的?

我是 python 的初学者,我发现关于 mutabilty 的内容非常令人困惑且不直观。给定一个列表:

并尝试在 for 循环中更改列表。

我了解这不会更改列表。但:

我很惊讶引用子列表会导致以下结果:

我试图用可视化器来理解,但我不明白。有人可以用简单的话解释一下吗?谢谢你。

0 投票
1 回答
410 浏览

c++ - 可变函子是否仍然“有效”可以使用

看完You don't know const and mutable后,我有点疑惑mutable以后如何正确处理。虽然我认为这种情况const非常安全,因为默认情况下会假定物理只读(减去旧的逻辑异常),正确处理mutable让我感到困惑。例如,对于新的线程安全条件,以下似乎是错误的:

我会假设,在这种情况下,n必须以另一种方式将其包装到 a 或受并发写入保护std::atomic的副本中!?n

0 投票
1 回答
647 浏览

object - 在 Rust(0.5 和/或树干)中,如何创建可变对象的可变向量?

我有以下代码(作为简化示例):

在尝试实现这些功能时,我不断遇到诸如指针/可变性类型( vs等)"unresolved name ItemList"之间的错误和冲突&~mut~mut

有人可以给我一个简单的例子,它只分配并返回空对象吗?从那里我应该能够填写数据。

0 投票
1 回答
151 浏览

c# - 处理函数式代码中的可变性的策略

我最近研究了FParsec的代码,它是 Haskell Parsec解析器组合库的 F# 端口。

FParsec公共 API 功能齐全,但它依赖于FParsecCS依赖于可变数据结构的支持库,并使用 CLR 不安全构造执行显式内存管理。

我认为这样做是出于性能原因。

我在函数式编程方面的经验仍然有限,所以我向更有经验的 FP 开发人员询问这是否是在这种情况下采用的一种好技术。

0 投票
1 回答
1092 浏览

c# - C# mutability - VS 代码分析给我 CA2104?似乎……可怜。我是不是误会了?

在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中附加到枚举值的信息不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如下面的简单示例所示:

但是当我在上面运行 Visual Studio 的“代码分析器”时,它给了我警告 C2104,“不要声明只读可变引用类型”。

我明白为什么您通常不想声明只读可变引用类型,但是......我的类不是可变的,是吗?

阅读警告的文档,似乎他们只是假设任何只读引用类型都是可变的。例如,它说如果类型真的是不可变的,那么可以随意取消这个警告。事实上,对于下面更简单的类,它给了我同样的警告:

所以,好吧,除非我严重误解了可变性,否则 CA2104 不理解它。它的建议是让我抑制出现的每一行的警告,只要我确定该类确实是不可变的。但:

(1) 因此,除非我完全关闭此检查,否则每次我使用不可变只读成员时都必须抑制它,对于任何给定的枚举,我可能会执行数百次?

(2) 但更糟糕的是,即使我这样做了,那么稍后有人可能会意外引入可变性,但其他人仍然会有错误的安全感,因为有人手动将抑制放在那里说“我检查过,这是不可变的“?