使用这样的一段代码,编译器抱怨c.MyProperty:
MyClass c;
try { throw new Exception(); }
catch (Exception) { }
c.MyProperty = 2; // "Use of unassigned local variable 'c'".
Run Code Online (Sandbox Code Playgroud)
然而,如果你指定一个不抱怨null到c在初始化:
MyClass c = null;
try { throw new Exception(); }
catch (Exception) { }
c.MyProperty = 2; // no complains this time.
Run Code Online (Sandbox Code Playgroud)
那么,为什么这有效呢?如果c未分配a null并且编译器假设允许它,则不会抛出相同的异常c.MyProperty,Object引用未设置为对象的实例?
将值赋给像这样的变量是否被认为是不好的风格?
x = "foobar" or None
y = some_variable or None
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,x得到值'foobar'.
(别担心,这不是关于解包元组的另一个问题.)
在python中,语句foo = bar = baz = 5将变量foo,bar和baz赋值为5.它从左到右分配这些变量,这可以通过像nastier这样的例子来证明
>>> foo[0] = foo = [0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> foo = foo[0] = [0]
>>> foo
[[...]]
>>> foo[0]
[[...]]
>>> foo is foo[0]
True
Run Code Online (Sandbox Code Playgroud)
但python语言参考声明赋值语句具有该形式
(target_list "=")+ (expression_list | yield_expression)
Run Code Online (Sandbox Code Playgroud)
在分配时,expression_list首先评估,然后分配.
那么这条线怎么可能foo = bar = 5是有效的,因为它bar = 5不是一个expression_list?如何在一行上解析和评估这些多项任务?我读错了语言参考吗?
只是为了澄清,当我说多个分配,并行分配,解构绑定我的意思是以下模式匹配宝石
scala> val (x,y) = Tuple2("one",1)
x: java.lang.String = one
y: Int = 1
Run Code Online (Sandbox Code Playgroud)
其分配"one"到x和1到y.
我试图做
val (x,y) = "a b".split()
Run Code Online (Sandbox Code Playgroud)
我期望scala会尝试将模式与模式进行模式匹配,如果数组的长度与模式的长度不匹配,则会抛出运行时异常.
我所有试图轻松转换Array为a的尝试Tuple2都是徒劳的.
scala> Tuple2(Array(1,2):_*)
<console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
in object Tuple2
Tuple2(Array(1,2):_*)
^
scala> Tuple2(Array(1,2).toList:_*)
<console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
in object Tuple2
Tuple2(Array(1,2).toList:_*)
Run Code Online (Sandbox Code Playgroud)
有没有任何巧妙的方法来使用数组或列表的多个赋值?
arrays functional-programming scala pattern-matching variable-assignment
我知道我不能用这个:
myView.frame.origin.x = 25.0;
Run Code Online (Sandbox Code Playgroud)
而我必须使用它:
CGRect myFrame = myView.frame;
myFrame.origin.x = 25.0;
myView.frame = myFrame;
Run Code Online (Sandbox Code Playgroud)
而且我一直这样做,但我不知道为什么我必须这样做.我想在我的理解中填补这个空白.谁能解释一下?
如今Xcode为您提供"表达式不可分配".前一段时间你得到一个编译错误"Lvalue需要作为赋值的左操作数".
愚蠢的问题:如何在Clojurescript中进行Javascript分配?我正在使用Javascript lib并且需要设置对象字段的值obj.this=that;- 我不知道Javascript所以也许有.set方法?
R允许通过<-和分配=.
虽然两个赋值运算符之间存在细微差别,但似乎存在广泛的共识,这<-是比较好的选择=,因为=它也被用作参数的运算符映射值,因此它的使用可能导致含糊不清的语句.以下举例说明:
> system.time(x <- rnorm(10))
user system elapsed
0 0 0
> system.time(x = rnorm(10))
Error in system.time(x = rnorm(10)) : unused argument(s) (x = rnorm(10))
Run Code Online (Sandbox Code Playgroud)
实际上,Google样式代码不允许使用=作业(请参阅此答案的评论以获得相反的观点).
我也几乎专门<-用作赋值运算符.然而,几乎在前一句中是这个问题的原因.当=我在我的代码中充当赋值运算符时,它总是偶然的,如果它导致问题,通常很难发现.
我想知道是否有办法关闭赋值=,让R抛出错误任何时候=用于赋值.
最佳地,这种行为只会发生在全局环境中的代码中,因为附加的命名空间中的代码很可能=用于赋值而不应该中断.
(这个问题的灵感来自与Jonathan Nelson的讨论)
可能重复:
如何在复制控制功能中处理C数组成员?
我想如果成员变量被声明为指针,隐式复制构造函数(由编译器生成)将复制指针.
我不确定数组成员变量会发生什么.
隐式复制构造函数是否正确复制数组成员?赋值运算符怎么样?
例如:
char mCharArray[100];
int mIntArray[100];
Run Code Online (Sandbox Code Playgroud)
是否可以正确复制mCharArray mIntArray?
我在这里 char text[60];
然后我做了一个if:
if(number == 2)
text = "awesome";
else
text = "you fail";
Run Code Online (Sandbox Code Playgroud)
它总是说表达式必须是可修改的L值.
我需要创建一个类,其对象可以初始化但不能分配.
我想也许我可以通过不定义赋值运算符来做到这一点,但编译器使用构造函数来进行赋值.
我需要它是这样的:
Object a=1; // OK
a=1; // Error
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
c++ ×2
python ×2
arrays ×1
c ×1
c# ×1
char ×1
coding-style ×1
constructor ×1
copy ×1
exception ×1
javascript ×1
lvalue ×1
objective-c ×1
r ×1
scala ×1
struct ×1