我来自C背景的javascript.在javascript中,当我使用赋值运算符将一个对象分配给另一个对象时,它是将值从一个复制到另一个,还是现在它们都指向相同的数据?或者,赋值运算符在这种情况下做了什么?
function point_type()
{
this.x = 0;
this.y = 0;
}
var pnt1 = new point_type();
var pnt2 = new point_type();
pnt1.x = 4;
pnt1.y = 5;
pnt2 = pnt1;
pnt1.x = 8;
pnt2.y = 9;
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,pnt2.x现在是否等于8,还是等于4,还是等于0?
是的,我意识到我可以自己测试一下,我会在等待社区提出答案时这样做.但是,我希望我的问题的答案只会回过头来回答这个例子,并且可能会对javascript对象的工作方式和一些最佳实践有所启发.
跟进问题:
答案似乎是复制了引用.pnt2和pnt1现在指向相同的数据.是否可以设置我的对象以便复制值?这通常是如何在javascript中完成的?显然,我不希望每次需要复制此对象时单独设置每个属性.
有没有办法在VB.NET中执行此操作,如在C风格的语言中:
struct Thickness
{
double _Left;
double _Right;
double _Top;
double _Bottom;
public Thickness(double uniformLength)
{
this._Left = this._Right = this._Top = this._Bottom = uniformLength;
}
}
Run Code Online (Sandbox Code Playgroud) 今天我们完成了在实验室完成的任务(两小时内完成).问题是:
任务结束了.但我仍然在想如何解决这个问题.这些问题是否有标准术语?我该怎么读?
人们也会使用这种算法在城市铺设道路吗?
我正在实现一个带有记录和内部动态数组的N x M矩阵(类),如下所示.
TMat = record
public
// contents
_Elem: array of array of Double;
//
procedure SetSize(Row, Col: Integer);
procedure Add(const M: TMat);
procedure Subtract(const M: TMat);
function Multiply(const M: TMat): TMat;
//..
class operator Add(A, B: TMat): TMat;
class operator Subtract(A, B: TMat): TMat;
//..
class operator Implicit(A: TMat): TMat; // call assign inside proc.
// <--Self Implicit(which isn't be used in D2007, got compilation error in DelphiXE)
procedure Assign(const M: TMat); // copy _Elem inside proc.
// …Run Code Online (Sandbox Code Playgroud) 显然,这在我的Firebug控制台中是相同的:
var x = "A", y = x;
x + y === "AA";
Run Code Online (Sandbox Code Playgroud)
和
var x = y, y = "A";
x + y === "AA";
Run Code Online (Sandbox Code Playgroud)
这是标准的ECMAScript行为,订单在逗号分隔的var分配中不起作用吗?
编辑: "神秘"得到解决.我先测试了第一个例子,然后清理了控制台并运行了第二个例子.然而,在这个时候,y和x已经被定义.如果你运行David Thomas提供的JSFiddle,你总会得到一个"undefinedA".案件已经解决
如何测试变量已被声明或分配(即检查是否定义了"a",当我希望程序调用这样的代码时(def a(create-a))?
并且相关---这个问题的答案如何解决已经宣布的符号(即函数)的解决问题? Clojure:确定函数是否存在
似乎定义的变量应该以与定义的函数相同的意义检查,但我发现确定函数是否存在的解决方案不足以确定变量是否存在.
一些上下文:我正在为多开发人员项目编写单元测试,并希望确保测试数据和不同类中的方法已被定义.由于没有好的IDE支持clojure,在我看来,鉴于其结构松散,在测试其输出/内容之前测试方法名称和变量名称是好的.
标量上下文中的列表赋值返回右侧的元素数:
scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2
Run Code Online (Sandbox Code Playgroud)
为什么它评估右侧并生成2,而不是新定义的列表被评估并返回3?
对我来说,似乎$hello得到7,$there得到8,$world得到undef,然后该列表在标量上下文中进行评估,这将导致3,因为这是列表中元素的数量($hello $there $world).对我来说,上下文会影响返回计算表达式的哪一部分,这似乎很奇怪:
my $greeting = (($hello, $there, $world) = (7,8)); #2
my @greeting = (($hello, $there, $world) = (7,8));
my $greeting_length = @greeting; #3
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在复制控制功能中处理C数组成员?
如果我不覆盖operator =类的类,它将使用默认的成员分配.
但是这是什么意思?
struct A {
int array[100];
};
A a;
A b=a;
Run Code Online (Sandbox Code Playgroud)
没错.如何bCOPES a的array?通常array_b = array_a无效.
另一个例子:
struct A {
vector<int> vec;
};
A a;
A b=a;
Run Code Online (Sandbox Code Playgroud)
如何bCOPES a的vec?通过assignment(vec_b = vec_a),constructor(vec_b = vector<int>(vec_a))或其他神秘的方式?
我的一个属性是一个属性,其中setter调用验证函数,如果新值无效则引发异常:
pos.offset = 0
# @offset.setter calls validate(offset=0)
# PositionError: Offset may not be 0.
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加测试以确保此操作失败.但是,我无法弄清楚如何让assertRaises与赋值一起工作.
assertRaises的正常语法需要一个方法,而不是一个属性/属性:
self.assertRaises(PositionError, pos.offset, 0)
# TypeError: 'int' object is not callable
Run Code Online (Sandbox Code Playgroud)
我尝试过的其他形式是无效的Python:
self.assertRaises(PositionError, pos.offset = 0)
# SyntaxError: Keyword can't be an expression
self.assertRaises(PositionError, lambda: pos.offset = 0)
# SyntaxError: lambda cannot contain assignment
Run Code Online (Sandbox Code Playgroud)
如何测试对属性的分配失败?
注意:Python 2.6,我知道unittest在2.7中有一些新功能
python unit-testing properties variable-assignment assertraises
我一直在阅读Bloch和Gafter的Java Puzzlers并得到了拼图10(Tweedledee).这个难题的本质是
为变量提供报关单
x和i这样的,这是一个法律声明:Run Code Online (Sandbox Code Playgroud)x = x + i;但这不是:
Run Code Online (Sandbox Code Playgroud)x += i;
根据这本书,解决方案看起来像这样:
Object x = "Buy ";
String i = "Effective Java!";
Run Code Online (Sandbox Code Playgroud)
该书声称,在+=操作符中,只有当左手表达式具有类型时,右手表达式才可以是任何类型String.但是,我尝试运行此代码,它编译并运行没有任何问题.
然后我挖掘了Java语言规范.第15.26.2节讨论了两种情况:当左侧表达式是数组访问表达式时,何时不是.如果左侧操作数表达式不是数组访问表达式,那么JLS没有说左手表达式是String.如果是,这部分应用:
如果T是引用类型,则它必须是String.因为类String是最终类,所以S也必须是String.因此,复合赋值运算符永远不需要简单赋值运算符有时需要的运行时检查.
❖数组组件的保存值和右侧操作数的值用于执行复合赋值运算符指示的二进制运算(字符串连接)(必须为+ =).如果此操作突然完成,则赋值表达式会因同样的原因突然完成,并且不会发生任何赋值.
这里的T是在编译时确定的左操作数的类型,S是所选的数组组件.所以我认为我会将我的代码修改为:
Object[] x = {new Object()};
String i = "Effective Java!";
x[0] += i;
Run Code Online (Sandbox Code Playgroud)
但即使这个代码编译和运行也没有任何问题,即使它甚至new Object()不是远程的String.
为什么会这样?这是否意味着Java编译器偏离了JLS?是否仍然可以以某种方式解决原始难题?
c++ ×2
javascript ×2
unit-testing ×2
algorithm ×1
assertraises ×1
c# ×1
c#-to-vb.net ×1
clojure ×1
deep-copy ×1
delphi ×1
expression ×1
java ×1
list ×1
matrix ×1
object ×1
optimization ×1
perl ×1
properties ×1
python ×1
record ×1
scalar ×1
variables ×1
vb.net ×1