小编Jus*_*s12的帖子

为什么ClassManifest需要Array而不是List?

定义以下代码:

import scala.collection.JavaConversions._  
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString

def test[T:ClassManifest](iter:java.util.Iterator[Any], func:Any=>T):Array[T] =  
  iter.map(i=>func(i)).toArray

def testFunc = test(iter, func)
Run Code Online (Sandbox Code Playgroud)

在这里,我需要使用ClassManifest它来正确编译,否则我得到错误:

scala> def test[T](iter:java.util.Iterator[Any], func:Any=>T):Array[T] = 
     |   iter.map(i=>func(i)).toArray         

<console>:11: error: could not find implicit value for evidence parameter of 
type ClassManifest[T]
     iter.map(i=>func(i)).toArray
                          ^
Run Code Online (Sandbox Code Playgroud)

另一方面,下面使用的替代代码List不需要这个并编译好.

import scala.collection.JavaConversions._  
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString 

def test1[T](iter:java.util.Iterator[Any], func:Any=>T):List[T] = 
  iter.map(i=>func(i)).toList   


def testFunc1 = test1(iter, func).toArray
Run Code Online (Sandbox Code Playgroud)

请注意,最终输出testFunctestFunc1相同.

为什么List …

scala scala-2.8 scala-collections

12
推荐指数
2
解决办法
1905
查看次数

是否可以扩展Scala编译器以推断返回类型的递归方法?

Scala编译器当前无法推断递归方法的返回类型,如以下代码所示

def foo(i:Int) = if (i > 0) foo (i-1) else 0
Run Code Online (Sandbox Code Playgroud)

上述声明中是否存在任何矛盾?(即,除了Int可能以外的任何类型?)

我可以想象,在更复杂的例子中,很难推断出类型.

是否有可能进一步描述递归方法的情况,我们可以(不)推断出类型?

[编辑:]编译器足够聪明,可以发现这String是不正确的.

scala> def foo(i:Int):String = if (i > 0) foo (i-1) else 0
<console>:5: error: type mismatch;
found   : Int(0)
required: String
Run Code Online (Sandbox Code Playgroud)

scala

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

自动为类参数创建getter(以避免大小写类)?

在Scala,如果我们有

class Foo(bar:String)
Run Code Online (Sandbox Code Playgroud)

我们可以创建一个新对象但无法访问 bar

val foo = new Foo("Hello")
foo.bar // gives error
Run Code Online (Sandbox Code Playgroud)

但是,如果我们宣布Foo成为case class这个工程:

case class Foo(bar:String) 
val foo = Foo("hello")
foo.bar // works
Run Code Online (Sandbox Code Playgroud)

因为这个原因,我被迫将我的许多课程作为案例课程.否则,我必须编写样板代码来访问bar:

class Foo(bar:String) {
  val getbar = bar
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 有没有办法在不使用案例类或样板代码的情况下"修复"这个问题?
  2. 在这种情况下使用案例类是一个好主意吗?(或者案例类的缺点是什么?)

我想第二个值得一个单独的问题.

scala

12
推荐指数
2
解决办法
8801
查看次数

Scala的ANTLR语法?

我正在尝试为演示项目构建静态分析工具.我们可以自由选择要分析的语言.我从使用ANTLR编写Java代码分析器开始.我现在想对Scala代码做同样的事情.但是,我找不到Scala的ANTLR语法.它存在吗?Scala语法还有其他机器可读的形式吗?

parsing antlr scala

12
推荐指数
2
解决办法
2930
查看次数

本地JavaScript - 写入本地文件

我有一些从本地HTML文件加载的JavaScript代码(无需通过网络服务器)..即,打开使用 file://

有没有办法将此文件中的JavaScript代码用于写入本地文件?

我知道跨站点限制不允许在JavaScript中使用很多东西,但这不是跨站点的,所以理论上应该允许它.

javascript jquery

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

模式匹配多个匹配

请考虑以下Scala代码.

val a = "both"

a match {
    case "both" | "foo" => println ("foo")   // case 1
    case "both" | "bar" => println ("bar")   // case 2
}
Run Code Online (Sandbox Code Playgroud)

我想match工作,如果a == "both",Scala将执行这两种情况.这是可能的还是有任何替代方案来实现我想要的?

scala pattern-matching

11
推荐指数
2
解决办法
1853
查看次数

Scala中方法类型参数化的结构类型?

考虑以下Scala代码(例如,在REPL中)

object A{def foo:Unit = {}}
object B{def foo:Unit = {}}

def bar[T <: Any {def foo: Unit}](param: T*):Unit = param.foreach(x => x.foo)

bar(A, A)  // works fine
bar(B, B)  // works fine
bar(A, B)  // gives error
Run Code Online (Sandbox Code Playgroud)

前两个工作正常.第三个给出错误:

error: inferred type arguments [ScalaObject] do not conform to method bar's type parameter bounds [T <: Any{def foo: Unit}]

有什么方法可以做我想要的吗?

scala

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

需要一个更好的"入门"指南为Lift

我已经使用Scala大约一年了,现在想进入Lift.在官方网站之后,我在http://simply.liftweb.net/index-Chapter-2.html#toc-Chapter-2获得了指南

但是,该示例不起作用.这是我得到的错误.

C:\Lift\hello>sbt update ~jetty-run

C:\Lift\hello>set SCRIPT_DIR=C:\scala\bin\

C:\Lift\hello>java -Xmx512M -jar "C:\scala\bin\sbt-launch.jar" update ~jetty-run
[info] Set current project to default-7944be (in build file:/C:/Lift/hello/)
[success] Total time: 0 s, completed 22 Feb, 2012 3:41:06 PM
[error] Not a valid command: jetty-run
[error] Not a valid project ID: jetty-run
[error] Not a valid configuration: jetty-run
[error] Not a valid key: jetty-run (similar: run)
[error] ~jetty-run
[error]           ^
Run Code Online (Sandbox Code Playgroud)

我以前没有使用过sbt,并且不想因为必须学习sbt,maven或其他东西而陷入困境.我本质上想要一个"hello"世界应用程序(在这种情况下,聊天应用程序)启动并运行,然后再进一步深入了解Lift.

不幸的是,官方"入门"指南中的第一个例子被打破了.任何想法错误是什么.我尝试了http://groups.google.com/group/simple-build-tool/browse_thread/thread/60635edfadbcd816建议的方法,没有任何运气

scala lift

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

如何避免Java中的"重复类"

假设我有一个java项目myProject并且正在使用外部库jar(someJar.jar),它有一个类com.somepackage.Class1.class.

现在我找到一个更新版本Class1.java修复了原始jar中的错误.

Class1.java在包的源代码中包含了newcom.somepackage

当我构建项目时(例如,使用Netbeans),有一个dist\myProject.jar包含类com.somepackage.Class1.class和一个dist\lib\someJar.jar包含具有相同名称的类的类.

当我运行文件(例如,使用java -jar dist\myProject.jar)时,使用新版本Class1.class(如我所愿).

  1. Java如何决定在出现这种重复的情况下运行哪个类文件?有什么办法可以指定优先顺序吗?

  2. 有没有"正确"的方法来避免这种冲突?

  3. 在Proguard中,当我尝试压缩代码时,出现duplicate class错误.我该如何消除这个?

java

10
推荐指数
2
解决办法
4万
查看次数

如何在受限沙箱中运行java代码(没有网络,文件系统访问)

假设一些程序员给我一个可执行jar(来自Java代码)以及要使用的入口点.我想在受限制的沙箱环境中从Java代码运行此jar(以编程方式),没有网络或文件系统访问或数据库访问以及固定数量的CPU和内存.即,Java代码不应该对我的jvm上运行的其他程序造成任何副作用.

理想情况下,我想根据情况允许某些访问(例如,只有某个目录中带有配额的文件).

java sandbox

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