除非方法是最终的,否则为什么Scala编译器不会应用尾调用优化?
例如,这个:
class C {
@tailrec def fact(n: Int, result: Int): Int =
if(n == 0)
result
else
fact(n - 1, n * result)
}
Run Code Online (Sandbox Code Playgroud)
结果是
错误:无法优化@tailrec带注释的方法:它既不是私有的也不是最终的,因此可以被覆盖
如果编译器在这种情况下应用TCO,究竟会出现什么问题呢?
如何使图像可点击?我尝试了一些方法,但没有成功.这是我尝试的最后一个代码(可点击但得到错误):
ImageView btnNew = (ImageView) findViewById(R.id.newbutton);
btnNew.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do stuff
}
});
Run Code Online (Sandbox Code Playgroud)
这是xml中的部分:
<ImageView
android:src="@drawable/tbnewbutton"
android:text="@string/hello"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:id="@+id/newbutton"
android:clickable="true"
android:onClick="clickImage"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
Run Code Online (Sandbox Code Playgroud)
运行此代码,然后单击图像我收到此错误:
01-24 19:14:09.534:ERROR/AndroidRuntime(1461):java.lang.IllegalStateException:在活动中找不到方法clickImage(View)
这是解决方案:
XML:
<ImageButton
android:src="@drawable/tbnewbutton"
android:text="@string/hello"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:id="@+id/newbutton"
android:clickable="true"
android:onClick="clickNew"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@null" />
Run Code Online (Sandbox Code Playgroud)
代码 :
public void clickNew(View v)
{
Toast.makeText(this, "Show some text on the screen.", Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud) 是否可以使用Facebook iOS SDK在应用程序内进行身份验证(而不是访问Safari),并为下次启动应用程序保留这些身份验证凭据?
当我尝试在模拟器中使用演示应用程序时,它总是去safari进行身份验证,这看起来有点糟糕.然后,当我进行身份验证时...如果我完全杀死该应用程序,它将要求再次进行身份验证(然后告诉我我已经登录)
有没有办法,只为用户提供一个电子邮件字段和密码字段,然后在应用程序中保留该信息?
对于自定义AlertDialog,我可以覆盖肯定按钮以不关闭对话框吗?相反,我想运行一些编辑检查,并在检查失败时保持对话框打开.
protected Dialog onCreateDialog(int id) {
Dialog alertDialog = null;
builder = new AlertDialog.Builder(this);
switch(id) {
case LOGIN_USERID_BLANK:
builder.setMessage((String)getString(R.string.username_not_blank));
builder.setPositiveButton((String)getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Can I do something here so that the dialog does not close?
}
});
Run Code Online (Sandbox Code Playgroud)
打破;
有时我看到一些应用程序允许自己在Windows上作为服务运行,例如Apache HTTP Server 允许这样做.我总是将它作为常规应用程序运行,从未遇到任何问题或限制.
所以,我使用[NSThread detachNewThreadSelector]来生成一个新线程,我在控制台中得到"自动释放,没有池到位"错误.我知道如果你没有创建一个自动发布池,就会发生这种情况,但问题是,我正在创建一个.我在同一个应用程序的其他部分使用类似的代码,并没有得到这些错误.
这是相关代码:
- (void) startThread:(NSString*)strURL
{
// start new thread to load image
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSThread detachNewThreadSelector:@selector(loadImageFromURL:) toTarget:self withObject:strURL];
[pool release];
}
- (void) loadImageFromURL:(NSString*)strURL
{
NSNumber* nn = [NSNumber numberWithInt:self.tag];
NSLog(@"loadURL: Tag number == %i", [nn intValue]);
// other code here actually does the work
}
Run Code Online (Sandbox Code Playgroud)
现在,loadImageFromURL中有更多代码实际完成了工作(从远程服务器加载图像) - 但是问题在没有代码的情况下显示出来,所以我删除了它(只是因为你不认为我有一个毫无意义的毫无意义的线程!).我只留下了一行代码来演示这个问题 - 它创建了一个自动释放的NSNumber对象.
当此代码运行时,它会向控制台报告:
__NSAutoreleaseNoPool(): Object 0x535c0e0 of class NSCFNumber autoreleased with no pool in place - just leaking
当然,真实代码会创建许多其他AR对象,并且所有这些对象都会被报告.
将不胜感激任何可能有用的提示或指示!
谢谢!
在我开始一个项目之前,我编写了一个简单的测试来比较来自(System.Collections.Concurrent)的ConcurrentBag相对于锁定和列表的性能.我非常惊讶ConcurrentBag比使用简单的List锁定慢10倍.据我所知,当读写器是同一个线程时,ConcurrentBag效果最好.但是,我没想到它的性能会比传统的锁更糟糕.
我已经运行了一个测试,其中有两个Parallel for循环写入和读取列表/包.然而,写入本身显示了巨大的差异:
private static void ConcurrentBagTest()
{
int collSize = 10000000;
Stopwatch stopWatch = new Stopwatch();
ConcurrentBag<int> bag1 = new ConcurrentBag<int>();
stopWatch.Start();
Parallel.For(0, collSize, delegate(int i)
{
bag1.Add(i);
});
stopWatch.Stop();
Console.WriteLine("Elapsed Time = {0}",
stopWatch.Elapsed.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)
在我的盒子上,这需要3-4秒才能运行,相比之下这段代码的0.5-0.9秒:
private static void LockCollTest()
{
int collSize = 10000000;
object list1_lock=new object();
List<int> lst1 = new List<int>(collSize);
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Parallel.For(0, collSize, delegate(int i)
{
lock(list1_lock)
{
lst1.Add(i);
}
});
stopWatch.Stop();
Console.WriteLine("Elapsed = {0}",
stopWatch.Elapsed.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,进行并发读写并不能帮助并发包测试.我做错了什么还是这个数据结构真的很慢?
[编辑] - …
我有一个带有URL字段的表单.该字段的默认值为:http://.但该领域不是必需的.用户可以跳过它并提交表单.它不应该返回错误,因为它不是必需的,因为它们没有输入URL.但是现在它确实如此,因为http://.
我听说我可以使用beforeValidate()检查它是否为http://,然后清除URL字段,允许我跳过错误消息.
但我不知道如何使用beforeValidate().我搜索了谷歌,但我找不到任何有用的例子.我在哪里放置beforeValidate()的代码?这是一个功能吗?如何从那里访问提交的表单数据?
谢谢.
我希望这不是一个愚蠢的问题,我已经查看了谷歌搜索结果的5个不同页面,但未能找到任何相关内容.
我需要做的是将包含所有十六进制字符的字符串转换为ASCII
String fileName =
75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000
Run Code Online (Sandbox Code Playgroud)
我看到的每一种方式都让你觉得必须先将它放入数组中.有没有办法循环每一个并转换它们?