假设我在Scala中有以下内容
object Foo {
var functions: List[String => String] = Nil // can be any type to any type.
def addFunc(f:String => String) = functions = f :: functions
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我会Foo
添加一些函数.我现在想构建一个新的.class文件,在Scala中实现类似的跟随:
object MyObject {
def process1(s:String) = // call Foo.functions(1)
}
Run Code Online (Sandbox Code Playgroud)
然后我想保存MyObject
字节码,即使Foo
不存在也可以在以后执行.
以上只是展示我想做的事情的一个例子.我得到了名字MyObject
,process1
我必须生成一个可执行文件MyObject.class
.MyObject
不需要源(它可能是Java源代码).
因此,在高层次上,我们需要获取内存"快照" Foo.function(1)
,将该快照转换为字节码进行存储,并生成MyObject
使用此字节码的字节码.
我发现的所有字节码工程库都太低级了,所以我想知道是否有更高级别的库可以让我处理抽象对象,如函数等.
我是Scala的新手.
Scala最好支持哪种数据库连接?我也在寻找访问数据库的完整示例(验证,连接,查询,提取结果)
我有一个MyTable表,在数据库MyDB中有两列(Value1,Value2),我需要访问它.
我一直在想postgresql,所以一些使用它的例子会很好.
提前致谢.
我有一个List
定义为:
val l = List("1", "2", "3")
Run Code Online (Sandbox Code Playgroud)
我想将它转换为字符串
"1:2:3"
Run Code Online (Sandbox Code Playgroud)
一种方法如下:
l.foldLeft("")((x, y) => x + (if (x == "") "" else ":") +y)
Run Code Online (Sandbox Code Playgroud)
有更优雅的方法吗?
[编辑:进一步说明]
Easy Angel的答案适用于l
具有"有意义" toString
方法的元素.
虽然我有l
as List[String]
,但l
可以是一个自动类型的列表,它不会覆盖该toString
方法,例如,如:
class my(i:Int) {
val x = i
}
Run Code Online (Sandbox Code Playgroud)
我也有一个方法
def getMy(m:my) = "Hello "+m.x
Run Code Online (Sandbox Code Playgroud)
所以我希望使用输出getMy
而不是默认toString
方法的输出.
考虑以下 Scala 代码
def NOTImplementedIn[T<: AnyRef](t:T):String =
throw new Exception(t.getClass.getName+": Input type not implemented")
def NOTImplementedOut[T<: AnyRef](s:String):T =
throw new Exception("Output type not implemented")
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,可以推断输入类型T
。有没有办法推断T
第二种情况下的输出类型?我想在异常中包含类型名称。
请考虑以下代码:
scala> case class Foo(s:String, t:String, r:String) {
| def == (f:Foo) = s == f.s && t == f.t
| }
defined class Foo
scala> val f1 = Foo("s", "t", "r")
f1: Foo = Foo(s,t,r)
scala> val f2 = Foo("s", "t", "r1")
f2: Foo = Foo(s,t,r1)
scala> f1 == f2
res24: Boolean = true
scala> Array(f1) contains (f2)
res25: Boolean = false
Run Code Online (Sandbox Code Playgroud)
我的印象是contains
使用==
上面定义的.我误会了吗?
版本:Scala-2-10-2
请考虑以下代码:
case class Foo(foo:Long, bar:Long)
type Bar = (Seq[Foo], Seq[Foo])
val a:Bar = (Seq(Foo(1, 2), Foo(2, 3)), Seq(Foo(3, 4), Foo(5, 6)))
val b:Bar = (Seq(Foo(1, 2), Foo(3, 4)), Seq(Foo(3, 4)))
val c:Bar = (Seq(Foo(1, 2), Foo(2, 3)), Seq(Foo(3, 4), Foo(5, 6)))
a == b // false
a == c // true
Run Code Online (Sandbox Code Playgroud)
这是如何以及为什么有效?它似乎按预期工作.我应该继续使用吗?
编辑:我不是要尝试定义一个新的运算符.我的问题是为什么上述工作按预期工作而不是我必须定义一个新工作.所以这个问题与链接的问题有些"相反".
我正在使用一个外部Maven项目,其中生成的jar包含一个二进制文件,foo/bar/file.dat
其源中的确切路径为src/main/foo/bar/file.dat
。由于某种原因需要此文件,否则代码将引发异常。
我试图将其转换为SBT项目,但文件未包含在jar中。
我尝试添加includeFilter in Compile := "parser.dat"
,但这给了我一个错误:
IO error while decoding .../src/main/foo/bar/file.dat with UTF-8: MALFORMED[1]
Please try specifying another one using the -encoding option
Run Code Online (Sandbox Code Playgroud)
如何告诉SBT将“原样”文件包含在已编译的jar中?
编辑:链接的问题是无关的。该问题询问“如何正确读取资源?”,而我想知道“假设这是我必须读取资源的方式,那么如何正确创建jar?”。
我想按原样使用3rd party库,而无需更改代码。
我有一些代码
case class A(s:String) {val x = "hello"}
Run Code Online (Sandbox Code Playgroud)
为什么我不能在x
没有实例化A类的情况下访问静态变量?如果我输入
A.x
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: value x is not a member of object A
Run Code Online (Sandbox Code Playgroud)
编辑:
我错过了提到剩下的代码.这是我想要使用的示例:
abstract class A { val name:String }
case class B(i:Int) extends A { val name = "B" }
case class C(b:Boolean) extends A { val name = "C" }
def getType(s:String) = s match {
case B.name => println ("Object B")
case C.name => println ("Object C")
}
Run Code Online (Sandbox Code Playgroud)
错误:
scala> def getType(s:String) = s match …
Run Code Online (Sandbox Code Playgroud) 说我有两个清单
val L1 = List[(Int, Int)]((1,1), (2,2))
val L2 = List[(Int, Int, Int)]((1,1,1), (2,2,2))
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个函数func
,它接受一个Int值i
以及第一个元素匹配的两个列表中的所有项i
.一种方法是
def func(i:Int) = {
L1.collect.collect{case any if any._1 != i => any}
L2.collect.collect{case any if any._1 != i => any}
}
Run Code Online (Sandbox Code Playgroud)
考虑到两条线是如此相似,如果可以缩短代码将是很好的.我正在以某种方式瘦我可以传递L1
(和L2
)作为参数func
.该函数不应该预先知道元组将具有多少元素,只是第一个元素是Int
.
这可能吗?
[编辑:我认为问题不够明确.我很抱歉.]
这就是我想要做的.我想在两个以上的列表上做这个,比如n,通过func
多次调用,每个列表一次.
L1 = L1.collect.collect{case any if any._1 != i => any}
L2 = L2.collect.collect{case any if any._1 != i => any}
...
Ln = Ln.collect.collect{case …
Run Code Online (Sandbox Code Playgroud) scala ×9
java ×2
bytecode ×1
collections ×1
database ×1
fold ×1
jdbc ×1
postgresql ×1
reflection ×1
sbt ×1