考虑以下两种情况:
boolean b = false;
int i = 0;
while(i++ < 5) {
b = true;
}
Run Code Online (Sandbox Code Playgroud)
要么
boolean b = false;
int i = 0;
while(i++ < 5) {
if(!b) {
b = true;
}
}
Run Code Online (Sandbox Code Playgroud)
哪个更"昂贵"呢?如果答案取决于使用的语言/编译器,请提供.我的主要编程语言是Java.
请不要问我为什么要这样做的问题..它们只是指出相关的准系统示例:应该在循环中反复设置相同的值,还是应该在每个循环上测试它它拥有改变所需的价值?
我正在尝试实现以下C#代码的等价物:
someStringValue = someStringValue ?? string.Empty;
Run Code Online (Sandbox Code Playgroud)
if if someStringValue为null,将赋值string.Empty(空字符串"":).我如何在Objective-C中实现这一目标?是我唯一的选择:
if(!someStringValue)
someStringValue = @"";
Run Code Online (Sandbox Code Playgroud)
解决方案感谢@Dave DeLong:
someStringValue = someStringValue ?: @"";
Run Code Online (Sandbox Code Playgroud) 在三元运算符中调用的方法递增变量并返回布尔值.当函数返回false时,将还原该值.我期望变量为1但是变为0.为什么?
public class Main {
public int a=0;//variable whose value is to be increased in function
boolean function(){
a++;
return false;
}
public static void main(String argv[]){
Main m=new Main();
m.a+=(m.function()?1:0);
System.out.println(m.a);//expected output to be 1 but got a 0 !!!!!
}
}
Run Code Online (Sandbox Code Playgroud) 正如在JavaScript 1.7的Mozilla changlog中可以看到的,他们已经添加了解构分配.可悲的是,我不是很喜欢这种语法(为什么要写a和b两次?):
var a, b;
[a, b] = f();
Run Code Online (Sandbox Code Playgroud)
这样的事情会好很多:
var [a, b] = f();
Run Code Online (Sandbox Code Playgroud)
这仍然是向后兼容的.类似Python的解构不会向后兼容.
无论如何,我能够想出的最好的JavaScript 1.5解决方案是:
function assign(array, map) {
var o = Object();
var i = 0;
$.each(map, function(e, _) {
o[e] = array[i++];
});
return o;
}
Run Code Online (Sandbox Code Playgroud)
其工作方式如下:
var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2
Run Code Online (Sandbox Code Playgroud)
但这真的很糟糕,因为_没有任何意义.它只是一个存储名称的空壳.但遗憾的是它需要因为JavaScript没有指针.在正面,您可以在值不匹配的情况下指定默认值.另请注意,此解决方案不会尝试切片阵列.所以你不能做类似的事情{first: 0, rest: 0}.但如果有人想要这种行为,那很容易做到.
什么是更好的解决方案?
所以我写了一些代码,我有这样的事情:
class Box
{
private:
float x, y, w, h;
public:
//...
Rectangle & GetRect( void ) const
{
return Rectangle( x, y, w, h );
}
};
Run Code Online (Sandbox Code Playgroud)
然后在一些代码中:
Rectangle rect = theBox.GetRect();
Run Code Online (Sandbox Code Playgroud)
哪个在我的调试版本中有效,但在发行版中有"问题"通过引用返回Rectangle - 我基本上得到了一个未初始化的矩形.Rectangle类有一个=运算符和一个复制构造函数.在没有弄清楚为什么会破坏的情况下,我实际上更感兴趣的是通过引用返回(新)对象的正确方法,以便将复制分配给变量.我只是傻吗?不应该这样做吗?我知道我可以返回一个指针,然后取消引用,但我不愿意.我的某些部分感觉像按值返回会导致对象的冗余复制 - 编译器是否会解决并优化它?
这似乎是一个微不足道的问题.经过多年的C++编码后,我感到尴尬,我不知道这一点,所以希望有人可以为我清除这一点.:)
每个人都知道在Python中,赋值不会返回一个值,大概是为了避免if在通常只是进行比较时对语句进行赋值:
>>> if a = b:
File "<stdin>", line 1
if a = b:
^
SyntaxError: invalid syntax
>>> if a == b:
... pass
...
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,人们可能会怀疑同一语句中的多个赋值也是语法错误.
实际上,a = (b = 2)这不是一个有效的表达式:
>>> a = (b = 2)
File "<stdin>", line 1
a = (b = 2)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:为什么a = b = 2在Python中工作,因为它适用于赋值语句有值的其他语言,比如C?
>>> a = b = c = 2
>>> a, b, c
(2, 2, 2)
Run Code Online (Sandbox Code Playgroud)
这种行为是否有记录?我在赋值语句文档中找不到任何相关内容:http: …
int a, b, n;
...
(a, b) = (2, 3);
// 'a' is now 2 and 'b' is now 3
Run Code Online (Sandbox Code Playgroud)
这种事情在C#中真的很有帮助.在这个例子中,'a'和'b'没有被封装在一起,例如位置的X和Y可能是.这是否以某种形式存在?
下面是一个不太重要的例子.
(a, b) = n == 4 ? (2, 3) : (3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)
Adam Maras在评论中表示:
var result = n == 4 ? Tuple.Create(2, 3) : Tuple.Create(3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)
然而,当他指出它创建一个新的三元组而不是更改指定的值时,上述示例的工作类型.
Eric Lippert要求用例,因此可能:
(a, b, c) = (c, a, b); // swap or reorder on one …Run Code Online (Sandbox Code Playgroud) 我经历过这些问题,
- Python将多个变量分配给相同的值?列表 关于元组的行为
,我想只是变量可能是字符串,整数或字典- 同时声明多个变量的更优雅方式
问题有一些我想问的问题,但接受的答案要复杂得多
所以我想要实现的目标,
我声明了这个变量,并且我希望将此声明减少到尽可能少的代码行.
details = None
product_base = None
product_identity = None
category_string = None
store_id = None
image_hash = None
image_link_mask = None
results = None
abort = False
data = {}
Run Code Online (Sandbox Code Playgroud)
什么是最简单,易于维护?
我开始工作几周了,而且(再一次)我偶然发现了一些对我来说很奇怪的事情:
// Not working
a := 1
{
a, b := 2, 3
}
// Works
a := 1
a, b := 2, 3
Run Code Online (Sandbox Code Playgroud)
我想同时分配两个变量.一个已经宣布,在一个优越的范围,另一个不是.
它不起作用:编译器尝试重新声明前一个变量.但是,如果在同一范围内声明此变量,则它可以正常工作.
这是为什么 ?
def isBig(x):
if x > 4:
return 'apple'
else:
return 'orange'
Run Code Online (Sandbox Code Playgroud)
这有效:
if isBig(y): return isBig(y)
Run Code Online (Sandbox Code Playgroud)
这不起作用:
if fruit = isBig(y): return fruit
Run Code Online (Sandbox Code Playgroud)
为什么第二个不起作用!?我想要1个班轮.除此之外,第一个将调用函数TWICE.
如何制作1个衬垫,不调用两次功能?
python ×3
.net ×1
c# ×1
c++ ×1
cocoa-touch ×1
go ×1
if-statement ×1
increment ×1
java ×1
javascript ×1
nsstring ×1
object ×1
objective-c ×1
performance ×1
reference ×1
return ×1
ternary ×1
tuples ×1
variables ×1