问题标签 [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.
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?
c - C中的常量正确性
const
显然,除非某些东西是可变的,否则使用它是一个好习惯,但你能走多远?如果我有一个字符串数组,我的函数签名应该包括这个吗?
我不会对其进行任何修改,因此它是指向常量数组的第一个元素的常量指针,指向常量字符数组的第一个元素。这很拗口,而且代码几乎不可读。这一切都是一个简单的数据结构,如argv
.
我觉得好像 const 应该是默认的,应该有一个 mutable 关键字。
您通常只是其中之一const
吗?那么,如果您仍然可以通过或多或少地取消引用来轻松更改它,那又有什么意义呢?
functional-programming - 什么时候可以修改函数式语言中的变量?
所以我正在使用 Racket Scheme 自学函数式编程,到目前为止我很喜欢它。作为我自己的练习,我一直在尝试以纯粹的功能方式实现一些简单的任务。我知道不变性是函数式风格的重要组成部分,但我想知道是否有任何时候可以。
我想到了一种有趣的方法,让函数在与过滤器一起使用时从字符串列表中去除非唯一字符串,如下所示:
如您所见,make-uniquer
返回一个字符串列表的闭包以比较其唯一性,这样它就可以充当过滤器的简单谓词。但我正在破坏性地更新封闭列表。这是不好的形式,还是可以以这种方式更改局部封闭变量?
python - 使就地操作返回对象是一个坏主意吗?
我在这里主要谈论的是 Python,但我想这可能适用于大多数语言。如果我有一个可变对象,那么让就地操作也返回该对象是一个坏主意吗?似乎大多数示例只是修改对象并返回None
。例如,list.sort
。
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:
python - 为什么子列表在 for 循环中是可变的?
我是 python 的初学者,我发现关于 mutabilty 的内容非常令人困惑且不直观。给定一个列表:
并尝试在 for 循环中更改列表。
我了解这不会更改列表。但:
我很惊讶引用子列表会导致以下结果:
我试图用可视化器来理解,但我不明白。有人可以用简单的话解释一下吗?谢谢你。
c++ - 可变函子是否仍然“有效”可以使用
看完You don't know const and mutable后,我有点疑惑mutable
以后如何正确处理。虽然我认为这种情况const
非常安全,因为默认情况下会假定物理只读(减去旧的逻辑异常),正确处理mutable
让我感到困惑。例如,对于新的线程安全条件,以下似乎是错误的:
我会假设,在这种情况下,n
必须以另一种方式将其包装到 a 或受并发写入保护std::atomic
的副本中!?n
object - 在 Rust(0.5 和/或树干)中,如何创建可变对象的可变向量?
我有以下代码(作为简化示例):
在尝试实现这些功能时,我不断遇到诸如指针/可变性类型( vs等)"unresolved name ItemList"
之间的错误和冲突&~mut
~mut
有人可以给我一个简单的例子,它只分配并返回空对象吗?从那里我应该能够填写数据。
c# - 处理函数式代码中的可变性的策略
我最近研究了FParsec的代码,它是 Haskell Parsec解析器组合库的 F# 端口。
FParsec
公共 API 功能齐全,但它依赖于FParsecCS
依赖于可变数据结构的支持库,并使用 CLR 不安全构造执行显式内存管理。
我认为这样做是出于性能原因。
我在函数式编程方面的经验仍然有限,所以我向更有经验的 FP 开发人员询问这是否是在这种情况下采用的一种好技术。
c# - C# mutability - VS 代码分析给我 CA2104?似乎……可怜。我是不是误会了?
在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中附加到枚举值的信息不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如下面的简单示例所示:
但是当我在上面运行 Visual Studio 的“代码分析器”时,它给了我警告 C2104,“不要声明只读可变引用类型”。
我明白为什么您通常不想声明只读可变引用类型,但是......我的类不是可变的,是吗?
阅读警告的文档,似乎他们只是假设任何只读引用类型都是可变的。例如,它说如果类型真的是不可变的,那么可以随意取消这个警告。事实上,对于下面更简单的类,它给了我同样的警告:
所以,好吧,除非我严重误解了可变性,否则 CA2104 不理解它。它的建议是让我抑制出现的每一行的警告,只要我确定该类确实是不可变的。但:
(1) 因此,除非我完全关闭此检查,否则每次我使用不可变只读成员时都必须抑制它,对于任何给定的枚举,我可能会执行数百次?
(2) 但更糟糕的是,即使我这样做了,那么稍后有人可能会意外引入可变性,但其他人仍然会有错误的安全感,因为有人手动将抑制放在那里说“我检查过,这是不可变的“?