小编Jus*_*s12的帖子

任何高级字节码编辑器?

假设我在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使用此字节码的字节码.

我发现的所有字节码工程库都太低级了,所以我想知道是否有更高级别的库可以让我处理抽象对象,如函数等.

java reflection scala bytecode

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

在Scala中使用哪个数据库(以及需要的示例)

我是Scala的新手.

Scala最好支持哪种数据库连接?我也在寻找访问数据库的完整示例(验证,连接,查询,提取结果)

我有一个MyTable表,在数据库MyDB中有两列(Value1,Value2),我需要访问它.

我一直在想postgresql,所以一些使用它的例子会很好.

提前致谢.

database postgresql scala jdbc

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

foldLeft的替代品,从第二个元素开始

我有一个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方法的元素.

虽然我有las 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 fold

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

我们可以推断通用输出类型吗?

考虑以下 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

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

Scala集合包含不使用==?

请考虑以下代码:

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

collections scala

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

可以使用==比较Scala中的Seq对吗?

请考虑以下代码:

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)

这是如何以及为什么有效?它似乎按预期工作.我应该继续使用吗?

编辑:我不是要尝试定义一个新的运算符.我的问题是为什么上述工作按预期工作而不是我必须定义一个新工作.所以这个问题与链接的问题有些"相反".

scala

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

SBT在jar中包含一个二进制文件

我正在使用一个外部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库,而无需更改代码。

java scala sbt

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

访问案例类的静态成员

我有一些代码

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)

scala

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

任意大小的元组,第一个元素类型固定

说我有两个清单

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,它接受一个I​​nt值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

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

标签 统计

scala ×9

java ×2

bytecode ×1

collections ×1

database ×1

fold ×1

jdbc ×1

postgresql ×1

reflection ×1

sbt ×1