我正在调查一个问题并遇到一些可疑代码,涉及使用比较运算符比较Date实例.例如
def stamp = ... //Date
def offset = ... //Integer
def d = new Date(stamp.time + offset)
if (d < new Date()) {
...
}
Run Code Online (Sandbox Code Playgroud)
该资源表明以上内容等同于以下内容
def stamp = ... //Date
def offset = ... //Integer
def d = new Date(stamp.time + offset)
if (d.compareTo(new Date()) < 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,关于日期的GDK文档仅包含使用compareTo,before和after和比较日期的示例.我似乎特别回想起由于遇到意外结果而特别避免在日期使用比较运算符.在上面的两个代码示例确实当量(也就是,我可以放心地在Groovy中使用的日期比较操作,或者我应该只使用compareTo,before和after)?
谢谢!
每次循环运行时是否可以生成不同的随机数.例如,我有:
for (int t=0;t<10;t++)
{
int random_x;
srand ( time(NULL) );
random_x = rand() % 100;
cout<<"\nRandom X = "<<random_x;
}
Run Code Online (Sandbox Code Playgroud)
但问题是,它每次都会生成相同的随机数.每次循环运行都可以生成不同的随机数吗?
是否有可能重置随机数初始化?
这有效吗?
switch(foo) {
case 'bar':
if(raz == 'something') {
// execute
} else {
// do something else
}
break;
...
default:
// yada yada
}
Run Code Online (Sandbox Code Playgroud) 例如,如果我有一个java命令行程序,它产生一个新线程(线程#2)进行一些轮询,然后睡5分钟.程序的主线程(线程#1)正在运行,然后在线程#2启动5分钟之前完成,所以程序将退出.这有什么问题吗?我应该在这个程序的主函数结束之前中断线程#1中的线程#2吗?
我正在尝试围绕使用不透明数据类型的旧C-API创建C++便捷包装器.有一个特定的C函数,它使用格式字符串,以及使用C <stdarg.h>工具的可变数量的参数.作为我的包装器的一部分,我希望能够将任意数量的参数(包括C++对象)传递给此函数.但是,由于<stdarg.h>设施显然无法处理非POD数据,因此我创建了一个模板化转换函数,它将C++对象(如std::string)转换为POD等价物.
我认为整个事情使用C++ 0x可变参数模板是一个简单的练习,但是我很难弄清楚如何在将转换函数应用于每个参数时正确地展开参数包的方式编写此函数.
到目前为止我所拥有的是:
template <class T, class... Args>
void apply(OPAQUE* object, const char* fmt_string, T&& val, Args&&... args)
{
apply(object, fmt_string, Convert(val), args...);
}
template <class... Args>
void apply(OPAQUE* object, const char* fmt_string, Args&&... args)
{
C_API_Function_Call(object, fmt_string, args...);
}
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为递归函数调用永远不会实际解包Args...,所以它只是递归直到堆栈溢出.我无法弄清楚如何解压缩参数,同时将当前参数传递给Convert函数,然后递归传递结果.
反正有没有这样做?
我正在制作一个简单的REST客户端,用于我的C#应用程序.在Windows上的.net它适用于http://和https://连接.在Ubuntu 10.10的单声道2.6.7(也用2.8测试,结果相同)只有http://有效.https:// connections在request.GetResponse()方法上抛出此异常:
Unhandled Exception: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a
at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process ()
at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- …Run Code Online (Sandbox Code Playgroud) 可能重复:
使用CLR中的'as'关键字进行转换
我最近了解了一种不同的演员方式.而不是使用
SomeClass someObject = (SomeClass) obj;
Run Code Online (Sandbox Code Playgroud)
可以使用以下语法:
SomeClass someObject = obj as SomeClass;
Run Code Online (Sandbox Code Playgroud)
如果obj不是SomeClass,它似乎返回null,而不是抛出一个类转换异常.
我看到如果转换失败并且我尝试访问someObject变量,这可能导致NullReferenceException.所以我想知道这种方法背后的理由是什么?为什么要使用这种方式而不是(旧)方式 - 它似乎只是将失败的演员问题"更深"地转移到代码中.
我需要使用PHP获取文本文件的行号.我需要的是"想要这条线".
我尝试使用file()将文件行放在一个数组中并使用array_search()进行搜索,但它不会返回行号.在这个例子中,我需要返回3作为行号.
$file = file("file.txt");
$key = array_search("WANT", $file);
echo $key;
Run Code Online (Sandbox Code Playgroud)
文本文件:
First Line of Code
Some Other Line
WANT THIS LINE
Last Line
Run Code Online (Sandbox Code Playgroud) 此问题涉及旧Java版本的行为和双重检查锁定算法的旧实现
较新的实现使用volatile并依赖于稍微改变的volatile语义,因此它们不会被破坏.
据说,除了long或double字段外,字段赋值总是原子的.
但是,当我读到为什么双重检查锁定被破坏的解释时,它说问题在于赋值操作:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
// other functions and members...
}
Run Code Online (Sandbox Code Playgroud)
- 线程A注意到该值未初始化,因此它获得锁定并开始初始化该值.
- 由于某些编程语言的语义,允许编译器生成的代码在A完成初始化之前更新共享变量以指向部分构造的对象.
- 线程B注意到共享变量已初始化(或显示),并返回其值.因为线程B认为该值已经初始化,所以它不会获得锁定.如果B在B看到A完成的所有初始化之前使用该对象(因为A尚未完成初始化或者因为对象中的某些初始化值尚未渗透到内存B使用(缓存一致性)) ,该程序可能会崩溃.
(来自http://en.wikipedia.org/wiki/Double-checked_locking).
什么时候可能?是否有可能在64位JVM分配操作中不是原子的?如果不是那么"双重检查锁定"是否真的被打破了?