我对以下python表达式很感兴趣:
d3 = dict(d1, **d2)
Run Code Online (Sandbox Code Playgroud)
任务是将2个词典合并为第三个词典,上面的表达式完成任务就好了.我对**运算符感兴趣,它对表达式究竟做了什么.我认为**是功率运算符,还没有看到它在上面的上下文中使用过.
完整的代码片段是这样的:
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d3 = dict(d1, **d2)
>>> print d3
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
Run Code Online (Sandbox Code Playgroud) 我只是尝试在VS2010上编译几个C++片段并分析IDA Pro上的可执行文件.我注意到的是,他们中的大多数在开始时都有类似的内容(在调用__security_check_cookie之后不久)
xor eax, ebp
和类似的东西
xor ecx, ebp
在底部.为什么会这样?编译器优化已关闭.
c++ assembly reverse-engineering buffer-overflow compiler-optimization
List 有两个方法指定将元素添加到(不可变)列表:
+:(实施Seq.+:),和::(仅在中定义List)+: 技术上有一个更通用的类型签名 -
def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That
def ::[B >: A](x: B): List[B]
Run Code Online (Sandbox Code Playgroud)
-丁忽略隐式的,它根据该文档信息仅需要That是List[B],签名是等效的.
List.+:和之间有什么区别List.::?如果它们实际上是相同的,我认为+:最好避免取决于具体实施List.但是为什么定义了另一个公共方法,客户端代码何时会调用它?
还有一个用于::模式匹配的提取器,但我想知道这些特定的方法.
以下代码将无法编译:
string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
Run Code Online (Sandbox Code Playgroud)
我得到:错误1无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换
要解决这个问题,我必须做这样的事情:
string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
Run Code Online (Sandbox Code Playgroud)
这个演员似乎毫无意义,因为这肯定是合法的:
string foo = "bar";
Object o = foo == null ? "gork" : foo;
Run Code Online (Sandbox Code Playgroud)
在我看来,当三元分支具有不同类型时,编译器不会将值自动提供给类型对象...但是当它们属于相同类型时,则自动装箱是自动的.
在我看来,第一个声明应该是合法的......
任何人都可以描述为什么编译器不允许这样做以及为什么C#的设计者选择这样做?我相信这在Java中是合法的......虽然我没有验证这一点.
谢谢.
编辑:我要求理解为什么Java和C#以不同的方式处理这个问题,C#中的场景下发生了什么使得它无效.我知道如何使用三元,而不是寻找一个"更好的方法"来编写示例代码.我理解C#中的三元规则,但我想知道为什么......
编辑(Jon Skeet):删除了"autoboxing"标签,因为这个问题没有涉及拳击.
在早期版本的C#IEnumerable中定义如下:
public interface IEnumerable<T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
从C#4开始,定义是:
public interface IEnumerable<out T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
string[] <: object[]C#中的(破坏的数组方差)相同的问题吗?我希望在定义类时注册一个类实例.理想情况下,下面的代码可以解决问题.
registry = {}
def register( cls ):
registry[cls.__name__] = cls() #problem here
return cls
@register
class MyClass( Base ):
def __init__(self):
super( MyClass, self ).__init__()
Run Code Online (Sandbox Code Playgroud)
不幸的是,此代码会生成错误NameError: global name 'MyClass' is not defined.
#problem here我正在尝试实例化的一行是什么,MyClass但装饰者还没有返回,所以它不存在.
是不是在使用元类或类似的东西?
我有许多代表各种实体的数据类.
哪个更好:使用泛型和接口编写泛型类(比如打印或输出XML),或者编写一个单独的类来处理每个数据类?
是否有性能优势或任何其他好处(除了节省我编写单独课程的时间)?
我在某处编写了Clojure.是真的编译,如Java或Scala,而不是解释,如Jython或JRuby?
interpreted-language compilation clojure jvm-languages compiled-language
我对条件运算符有点疑惑.请考虑以下两行:
Float f1 = false? 1.0f: null;
Float f2 = false? 1.0f: false? 1.0f: null;
Run Code Online (Sandbox Code Playgroud)
为什么f1变为null而第二个语句抛出NullPointerException?
Langspec-3.0 para 15.25 sais:
否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.
所以对于false?1.0f:nullT1是Float而T2是null类型.但结果是lub(T1,T2)什么?第15.12.2.7段只是有点太多了......
顺便说一句,我在Windows上使用1.6.0_18.
PS:我知道Float f2 = false? (Float) 1.0f: false? (Float) 1.0f: null;不会抛出NPE.
java type-conversion nullpointerexception conditional-operator
我的Makefile中的一条规则将整个目录(res/)压缩为ZIP文件.显然,当目录下的任何文件res/发生更改时,需要执行此规则.因此,我希望规则将该目录下的所有文件作为先决条件.我该如何实施这条规则?
在启用了globstar选项的 Bash中,您可以使用通配符模式获取该目录中所有文件的列表res/**/*.但是,如果将其指定为Makefile中的先决条件,它似乎不起作用:
filename.jar: res/**/*
Run Code Online (Sandbox Code Playgroud)
即使在touch输入文件后res/,仍然可以生成报告
make: `filename.jar' is up to date.
Run Code Online (Sandbox Code Playgroud)
很明显它没有认识到这种模式.
如果我将目录本身声明为先决条件:
filename.jar: res
Run Code Online (Sandbox Code Playgroud)
然后在修改文件时不会重新执行Make(我认为make只查看目录本身的修改日期,只有在添加,删除或重命名直接子项时才会更改).
c# ×3
generics ×2
operators ×2
python ×2
.net ×1
assembly ×1
c++ ×1
clojure ×1
compilation ×1
cons ×1
covariance ×1
dbnull ×1
decorator ×1
dictionary ×1
glob ×1
gnu-make ×1
ienumerable ×1
java ×1
list ×1
makefile ×1
metaclass ×1
nullable ×1
oop ×1
performance ×1
prepend ×1
scala ×1
syntax ×1
wildcard ×1