小编Bri*_*Hsu的帖子

如何在D Programming Language + Tango中获取单键击中?

我读了这篇文章并试着用D编程语言练习,但在第一次练习中遇到了问题.

(1)在无限循环中显示数字序列(1,2,3,4,5 ......等).如果有人按特定键(Say ESCAPE键),程序应该退出.

当然,无限循环不是一个大问题,但其余的是.我怎么能在D/Tango中获得一个关键击中?在tango FAQ中它说使用C函数kbhit()或get(),但据我所知,这些不在C标准库中,并且不存在于我用于编程的Linux机器附带的glibc中.

我知道我可以使用像ncurses这样的第三方库,但它有同样的问题,就像kbhit()或get()一样,它不是C或D中的标准库,也没有预先安装在Windows上.我希望我能完成这个练习只使用D/Tango并且可以在Linux和Windows机器上运行它.

我怎么能这样做?

d input tango

3
推荐指数
1
解决办法
1463
查看次数

在SBT 0.13中设置scaladoc的输出目录(因为不推荐使用docDirectory)?

似乎docDirectory in Compile <<= (baseDirectory / "api")已弃用,如果build.sbt包含该设置,sbt将无法启动.

我应该如何在sbt 0.13中设置scaladoc的输出目录?

scala sbt

3
推荐指数
1
解决办法
538
查看次数

ScalaQuery中用于理解的元素类型

当我遵循ScalaQuery的Queries教程时,我发现了一些有趣的东西,我不知道为什么这么好.

这是我定义的数据库模式:

object Users extends Table[(Int, String, String)]("users") {
    def id = column[Int]("id", O NotNull)
    def first = column[String]("first", O NotNull)
    def last = column[String]("last", O NotNull)
    def * = id ~ first ~ last 
}
Run Code Online (Sandbox Code Playgroud)

这是我使用的查询:

object Main
{
    val database = Database.forURL("jdbc:sqlite:sample.db", driver = "org.sqlite.JDBC")
    def main(args: Array[String]) {
        database withSession {

            val query1 = for (user <- Query(Users)) yield user.id ~ user.last
            val query2 = for (user <- Users if user.id > 5) yield user.id ~ user …
Run Code Online (Sandbox Code Playgroud)

types scala scalaquery

2
推荐指数
1
解决办法
499
查看次数

在Java/Scala中将Unicode(CJK ExtB)字符转换为十进制NCR

我正在尝试将包含CJK ExtB计划中的Unicode字符的Java字符串转换为十进制NCR.

例如(你可以试试http://people.w3.org/rishida/tools/conversion/):

  • "游钖堃"应转换为 &#28216;&#37722;&#22531;
  • "怀"应转换为 &#162215;&#25079;

这是我尝试过的(在Scala中):

def charToHex(char: Char) = "&#%d;" format(char.toInt)
def stringToHex (string: String) = string.flatMap(charToHex)

println (stringToHex("???")) // &#28216;&#37722;&#22531;
println (stringToHex("?"))   // &#55390;&#56743;&#25079;
println ("?".toCharArray().length) // Why it is 3?
Run Code Online (Sandbox Code Playgroud)

如您所见,它在第一种情况下正确转换,三个unicode字符转换为三个NCR.

但在第二种情况下"怀",只有两个unicode字符,但Java/Scala似乎认为它是一个包含三个字符的字符串.

那么,这里发生了什么,我怎么能正确地转换第二个案例就像我提到的网站上的转换器一样?非常感谢.

更新:

  • 我的源代码文件使用的是UTF-8.
  • 这是"怀".toCharArray()的结果
    • char[] = ?, char.toInt = 55390
    • char[] = ?, char.toInt = 56743
    • char[] = ?, char.toInt = 25079

现在我想我知道发生了什么.字符""在UTF-16中编码为0xD85E 0xDDA7,它是4个字节而不是2个字节.因此在转换为char数组时需要2个元素,其中数据类型char只能表示2个字节.

java unicode scala character-encoding unicode-string

1
推荐指数
1
解决办法
2641
查看次数

由于Java/Android GC,是否可能将整数重置为零?

我读过一篇博文(抱歉用中文写的),作者说:

这是一个与web相关的应用程序,我们声明了一些私有变量,当用户做了一些操作时,这些变量将设置为某个值供以后使用.

通常应用程序运行良好,但是当我们使用繁重的JavaScript打开某个网站时,我们的应用程序开始表现错误且意外(没有任何活动切换),我们无法找到原因.

最后,我们发现这是由整数变量设置为零引起的.但我们非常肯定我们的代码不会将其重置为零,因此只有一个可能的结论:"为了满足WebView所需的资源,垃圾收集器已经收集了我们的变量".所以最后我们设置将此变量声明为静态变量以避免此问题.

坦率地说,这个"GC设置为零到零"的论点完全违背了我的Java知识.

因为据我所知:

  1. Java GC的收集单元是对象,而原始类型int在Java中不是对象.
  2. 实例变量的生命周期与所有者对象的生命周期相同,并且当GC收集该对象时,将释放该实例变量使用的内存.
  3. 即使该变量是一个Integer对象而不是原始int因此可以被收集,只要有一个可达的引用,它就不会被收集.
  4. 即使我们使用WeakReference来存储Integer引用以使Integer对象可收集,在收集Integer对象之后,无论如何我们都无法访问已经释放的对象的内存.

但我也担心是否有一些我没有考虑过的事情.

所以我对以下问题非常感兴趣:

  1. 我有任何可能的情况,由于垃圾收集,int或Integer对象可以重置为零?
  2. 是否有可能GC只释放一个对象占用的部分内存空间(如只有一个实例变量),而不是完整对象?
  3. 是否可以引用已经被垃圾收集的对象,如果我们取消引用它会发生什么?
  4. 对于这种情况,最可能的情况是假设变量随机重置为零,而不是由它们的代码引起的.VM错误?GC错误?JIT错误或其他什么?

java android garbage-collection

1
推荐指数
1
解决办法
1025
查看次数