问题标签 [assignment-operator]

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 回答
3236 浏览

scala - 关于 Scala 的 assignments 和 setter 方法

编辑:提示此问题的错误现已修复


在 Scala Reference 中,我可以阅读(第 86 页):

对简单变量 x = e 赋值的解释取决于 x 的定义。如果 x 表示可变变量,则赋值将 x 的当前值更改为计算表达式 e 的结果。e 的类型应该符合 x 的类型。如果 x 是在某个模板中定义的无参数函数,并且同一模板包含一个 setter 函数 x_= 作为成员,则赋值 x = e 被解释为该 setter 函数的调用 x_=(e)。类似地,对无参数函数 x 的赋值 f.x = e 被解释为调用 f.x_=(e)。

因此,例如,这样的事情可以正常工作:

然后我可以写

但是如果我这样定义类,在方法a中添加一个类型参数:

然后它不再起作用了;error: reassignment to val如果我写的话,我会得到一个a.a = 10。有趣的是,例如,它仍然可以在没有类型参数和隐式参数列表的情况下工作。

可以说,在这个例子中,类型参数不是很有用,但是在 DSL 的设计中,即使 getter 有类型参数,也可以调用 setter 方法(顺便在 setter 上添加类型参数)被允许并且工作正常)。

所以我有三个问题:

  1. 有解决方法吗?
  2. 当前的行为是否应该被视为错误?
  3. 为什么编译器强制使用 getter 方法以允许使用 setter 的语法糖?

更新

这就是我真正想做的事情。它相当长,抱歉,我本打算避免使用它,但我意识到省略它会更令人困惑。

我正在使用 Scala 中的 SWT 设计 GUI,并且使用 Dave Orme 的XScalaWT获得了极大的乐趣,这极大地减少了所需代码的数量。这是他的博客文章中的一个示例,内容是关于如何创建Composite将°C 转换为°F 度的 SWT:

每个小部件构造方法的参数都是 type ,带有一些有用的隐式转换,例如允许直接为具有方法(WidgetType => Any)*的小部件指定字符串。setText()所有构造函数都是从单例对象导入的。

最后,我希望能够按照这些思路写一些东西:

这将通过 WritableValue 变量将文本字段的可编辑属性绑定到复选框的选择。

首先:命名参数在这里不适用,所以该行editable = false必须来自某个地方。因此,沿着单例对象中的小部件构造方法,我可以在概念上编写,

...但这仅在吸气剂也存在时才有效。太好了:无论如何我都需要 getter 来实现与 <=> 的数据绑定。像这样的东西:

如果这行得通,生活会很好,因为我可以在 BindingMaker 中定义 <=> 并且我可以使用这个很好的语法。但可惜的是,getter 上的类型参数破坏了 setter。因此我最初的问题是:为什么这个简单的类型参数会影响编译器是否决定继续使用语法糖来调用 setter?

我希望这使它现在更清楚一点。感谢阅读……</p>

0 投票
1 回答
96 浏览

c# - 设置 BindingList 时是否需要分离和重新附加事件

我有以下代码:

但我不得不思考。如果这对 assingment 运算符来说是一个重载,那将是最好的。然后我想知道他们是否真的这样做了,我可以用这个替换我的代码:

是真的?这会:

仍然将AddingNew事件设置NewItemAdded()BoxesToDisplay?

0 投票
7 回答
2117 浏览

c - 在 C 中,a += b 是否比 a = a + b 更有效?

我知道某些语言的以下内容:

比:

因为它消除了创建临时变量的需要。这是C中的情况吗?使用 += 是否更有效(因此也是-= *=等)

0 投票
4 回答
175 浏览

c++ - 默认构造函数和对象复制

我想知道为什么在这种情况下我需要声明一个默认构造函数。一方面,如果我将其排除在外,编译器不会自动执行此操作吗?无论如何,我仍然不明白为什么它是必要的。此外,即使我省略 'obj_B = origin.obj_B;' 我也会收到错误消息

0 投票
3 回答
1792 浏览

c++ - 在 C++ 中,如何在不重复代码的情况下为类复制构造函数和赋值运算符提供相同的功能

可能的重复:
什么是复制和交换习语?
C ++中的复制构造函数和=运算符重载:通用函数可能吗?

有没有一种方法可以使复制构造函数和赋值运算符的主体包含相同的代码而实际上没有重复的代码(函数头除外)?

0 投票
5 回答
2179 浏览

c++ - 我们什么时候应该将赋值运算符设为私有而不实现

这是一个古老的考试问题,它要求我们编写赋值运算符和复制构造函数,在有意义的情况下编写析构函数。

给定以下代码:

我了解到答案是:A 持有对 U 实例的 C++ 引用,可以复制但不能重置。因此,您必须:

• 编写一个复制构造函数,将其 U 初始化为 A 源实例引用的同一实例。

• 将其赋值运算符设为私有且不实现

我知道引用无法重置。但是,这是否意味着当类包含引用成员数据时,我永远不能使用赋值运算符?下面的代码有意义吗?以下代码是我自己写的(不是答案)

提前致谢。

0 投票
3 回答
1899 浏览

function - Set ( = ) 和 SetDelayed ( := ) 有什么区别?

这个讨论出现在上一个问题中,我很想知道两者之间的区别。带有示例的插图会很好。

0 投票
6 回答
72865 浏览

c++ - 复制构造函数和赋值运算符

如果我重写operator=,复制构造函数会自动使用 new 运算符吗?同样,如果我定义了一个复制构造函数,是否会operator=自动“继承”复制构造函数的行为?

0 投票
2 回答
6256 浏览

c++ - 重载 operator= 作为非成员

根据对该线程的回复,operator=不能作为非成员函数重载。因此,例如,以下内容使编译器非常生气:

为什么是这样?我有一个带有 getter 和 setter 的容器类,所以成员函数是不必要的,它会破坏封装。上述线程的一个答案是确保“将 L 值作为其第一个操作数接收”,但我不完全理解这意味着什么。有人可以澄清一下吗?

此外,是、、和operator=operator()奇怪”的情况......?或者我应该将所有重载运算符实现为成员函数......?(我知道这样做是完全合法的,但我正在寻找更好的做法。)operator[]operator->

0 投票
4 回答
1207 浏览

c++ - 复制构造函数、析构函数和赋值运算符。我们什么时候不需要它们?

当您将 cctor、dtor 或 op= 添加到您的班级时,我知道 C++ 的经验法则,您还需要添加另外两个以使您的班级在所有情况下都能正常工作。

是否有任何情况下您不需要提供所有三个,只需提供其中一两个?

如果您将其中一个添加到您的类中,为什么 C++ 不要求您将它们全部添加?

编辑1:

当您不仅不需要其中一些示例,而且您不想拥有它们,因此您希望将它们设为私有或受保护时,您提到了示例。但是即使是空的主体,您仍然需要在代码中编写它们。

当您通过添加具有空主体的虚拟析构函数来使类多态时,我没有全部拥有它们的唯一正当理由。但是一旦你在析构函数的主体中写了一些东西,你应该考虑在 cctor 和 op= 的主体中写一些东西。

我正在寻找不需要编写所有 3 种方法的示例,并且即使新手正在使用您的课程,您也可以省略其中一些方法而不会在您的课程中造成错误。:)