我一直在尝试创建一个dict
继承的子类,UserDict.DictMixin
它支持不可散列的密钥.性能不是问题.不幸的是,Python DictMixin
通过尝试从子类创建一个dict对象来实现一些功能.我自己可以实现这些,但我坚持下去__cmp__
.
我找不到__cmp__
dict类内置使用的逻辑的简洁描述.
以下代码使用Java 8编译,但不编译Java 9:
public class CompileErrJdk9 {
@FunctionalInterface public interface Closure<R> {
R apply();
}
@FunctionalInterface public interface VoidClosure {
void apply();
}
static <R> R call(Closure<R> closure) {
return closure.apply();
}
static void call(VoidClosure closure) {
call(() -> { closure.apply(); return null; });
}
static <T> void myMethod(T data) {
System.out.println(data);
}
public static void main(String[] args) {
call(() -> myMethod("hello")); //compile error in jdk9
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
CompileErrJdk9.java:24: error: incompatible types: inference variable R has incompatible bounds
call(() …
Run Code Online (Sandbox Code Playgroud) 我们有一个庞大的旧C++应用程序,其中包含许多遗留代码和一些用C编写的外部库.这些库很少更新 - 只有当我们发现错误并且供应商提供补丁时.这发生在上周有一个库,在集成新版本后,我们发现如果我们不在本地修改库(我们显然使用上一版本),我们的构建就会出现以下错误消息:
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
Run Code Online (Sandbox Code Playgroud)
这是因为库声明了许多句柄类型,如下所示:
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
Run Code Online (Sandbox Code Playgroud)
我们在一些类的函数签名中使用它们:
class MyCls {
public:
static void* myFct(Handle handle);
...
}
Run Code Online (Sandbox Code Playgroud)
这会产生上述错误,因为编译器无法为函数创建正确的名称标记名称,因为_Opaque结构没有名称.
我们当前的解决方法是修补库头文件,显式给结构命名:
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
Run Code Online (Sandbox Code Playgroud)
这显然很糟糕,因为如果可能的话我们不想触摸库.另一个更糟糕的选择是将类型转换为void*
所有函数签名并将它们转换回各自的类型.并且在纯C中重写每个受影响的函数是最糟糕的选择...
所以,我的问题是:有没有比修补图书馆更好的选择?我有一个简单的解决方案吗?解决这个问题的最佳方法是什么?
我尝试了以下分析器,所有这些都与 pypy (5.8.0) 不兼容:
__itemsize__
,并且根据一些谷歌结果,它无论如何都不会产生有用的结果most_common_types()
返回一个空列表。有没有办法在pypy(相当于objgraph.most_common_types()
)中获取类型列表及其实例的内存使用情况?
是否可以以编程方式在exe文件或快捷方式文件上设置"以管理员身份运行"标志?
如果我在安装过程中执行此操作,Installshield是否支持此功能?
我正在尝试为此找到相关的命令行/ API/installshield命令.
Flash正在从应用程序开始正常运行(将surface_view添加到布局),当我尝试通过app-widget打开闪存时,它无法正常工作.我用过Camera和SurfaceView这是我正在使用的代码
Camera mCamera;
SurfaceView preview;
mCamera = Camera.open();
mCamera.setPreviewDisplay(preview.getCameraHolder());
Parameters params = mCamera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
mCamera.startPreview();
Run Code Online (Sandbox Code Playgroud)
Manifest中添加的权限和功能包括:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
Run Code Online (Sandbox Code Playgroud) 在SML中,我必须使用该else
部分,因为这些是语言的规则.
else
那时我怎么能做什么呢?
fun calc(input : string ) : int =
let
val outStr = ref "someString"
val outInt = ref 0
in
outInt := (validateHelper(input) handle _ => ~1);
if (outInt <> ~1)
then
( outStr := replaceRomanDec(input); (* replace roman number with decimal *)
outInt := (calcMyRomanExpression(!outStr) handle _ => ~1);
)
else (* nada *)
!outInt
end;
Run Code Online (Sandbox Code Playgroud) 我在清理旧C/C++应用程序的调试宏时遇到了这个问题:我们有一个继承自的Tracer类ostrstream
(我知道它自C++ 98以来已被弃用,但这个应用程序是在1998年编写的!)我们使用它像这样:
Tracer() << "some" << " message" << " here";
Run Code Online (Sandbox Code Playgroud)
现在,如果链中的第一个值是上面的常量字符串,则调用ostrstream::str()
Tracer 的结果(在析构函数中完成,将结果插入到队列中)包含指向此字符串的指针的十六进制表示,而不是文本.因此,上述陈述会产生类似的结果"0x401a37 message here"
.旧宏不会发生这种情况,因为它们总是有一个长(线程ID)作为现在已被删除的第一个值.
使用gdb进入它会显示,对于第一次插入,这将调用operator<<(void const*)
ostrstream,而后续插入调用operator<< <...>(basic_ostream<...>&, char const*)
(为了可读性而移除了模板).
有人可以解释这种行为吗?什么是一个干净的方法来解决这个问题?我找到了一个简单的解决方法,它<< left
用作第一个参数 - 这样安全吗?有没有更好的方法来做到这一点?
这是一个最小化的例子:
#include <strstream>
#include <iostream>
using namespace std;
class Trace : public ostrstream {
public:
Trace();
virtual ~Trace();
};
Trace::Trace() : ostrstream() {}
Trace::~Trace() {
static_cast< ostrstream& >(*this) <<ends;
char * text = ostrstream::str();
cout << "MESSAGE: "<< text <<endl;
delete[] text;
}
int …
Run Code Online (Sandbox Code Playgroud) 我想运行位于以下目录中的应用程序:
C:\ LCR 12\stu.exe
使用AutoIt,运行上述stu.exe文件的代码是什么?
给定一个数字列表,我想创建一个新列表,其中index处的元素i
是i-1
之前所有元素的总和.
例如 :
[1,4,6,9] -> [1,5,11,20]
Run Code Online (Sandbox Code Playgroud)
我写了以下代码:
fun sum nil = 0
| sum [x]=x
| sum(x::rest)=(x+hd(rest))::sum(rest);
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
- fun sum nil = 0
= | sum [x]=x
= | sum(x::rest)=(x+hd(rest))::sum(rest);
stdIn:306.16-306.39 Error: operator and operand don't agree [literal]
operator domain: int * int list
operand: int * int
in expression:
x + hd rest :: sum rest
Run Code Online (Sandbox Code Playgroud)
我可以看到递归规则(x+hd(rest))::sum(rest);
是问题的原因,但我该如何解决呢?
问候