小编oxb*_*kes的帖子

Scala将类型参数传递给对象

在Scala v 2.7.7中

我有一个文件

class Something[T] extends Other

object Something extends OtherConstructor[Something]
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

class Something
take type parameters object Something extends OtherConstructor [Something] {

但是,我不能这样做

object Something[T] extends OtherConstructor[Something[T]]
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

错误:';' 预期,但'''发现.

是否可以将类型参数发送到对象?或者我应该改变并简单地使用Otherconstructor

scala object type-parameter

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

StringContext和宏:一个简单的例子

我正在尝试实现一个StringContext扩展,这将允许我写这个:

val tz = zone"Europe/London" //tz is of type java.util.TimeZone
Run Code Online (Sandbox Code Playgroud)

但有一点需要注意,如果提供的时区无效(假设可以在编译时确定),它将无法编译.

这是一个辅助函数:

def maybeTZ(s: String): Option[java.util.TimeZone] =
  java.util.TimeZone.getAvailableIDs collectFirst { case id if id == s =>
    java.util.TimeZone.getTimeZone(id)
  }
Run Code Online (Sandbox Code Playgroud)

我可以很容易地创建一个非宏实现:

scala> implicit class TZContext(val sc: StringContext) extends AnyVal {
 |   def zone(args: Any *) = {
 |     val s = sc.raw(args.toSeq : _ *)
 |     maybeTZ(s) getOrElse sys.error(s"Invalid zone: $s")
 |   }
 | }
Run Code Online (Sandbox Code Playgroud)

然后:

scala> zone"UTC"
res1: java.util.TimeZone = sun.util.calendar.ZoneInfo[id="UTC",offset=0,...
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.如果时区是无意义的(例如zone"foobar"),那么编译不会失败; 代码在运行时失效.我想将它扩展到一个宏,但是,尽管阅读了文档 …

scala scala-macros

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

斯卡拉地图:神秘的语法糖?

我刚刚发现了scala的这种语法Map(这里以可变形式使用)

val m = scala.collection.mutable.Map[String, Int]()
m("Hello") = 5
println(m) //PRINTS Map(Hello -> 5)
Run Code Online (Sandbox Code Playgroud)

现在我不确定这是否是语言中内置的语法,或者这里是否有更基本的东西涉及地图扩展的事实PartialFunction.谁能解释一下?

maps scala syntactic-sugar scala-collections

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

Scala中的惯用表格单元格渲染器

我一直在使用传统的Java TableCellRenderer方法scala.swing.Table在我在桌面上声明我的渲染器的地方提供渲染器TableColumnModel.这个代码看起来像:

val myTable = new Table {
  lazy val tcm = initColumnModel
  peer.setColumnModel(tcm)

  override 
  protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
    //GET THE VALUE FROM THE TableModel
    val value = model.getValueAt(
                        peer.convertRowIndexToModel(row), 
                        peer.convertColumnIndexToModel(col))
    //GET THE RENDERER FROM THE ColumnModel
    val renderer = tcm.getColumn(col).getCellRenderer
    //WRAP IN A COMPONENT
    Component.wrap(renderer.getTableCellRendererComponent(
                        peer, 
                        value, 
                        sel, 
                        foc, 
                        row, 
                        col).asInstanceOf[JComponent])
   }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎有内存泄漏 - 大概是因为我正在为表中的每个单元创建一个新的Component实例(大约30k行).当然,当我用一个JTable(使用完全相同的数据模型)替换我的scala表时,我的内存泄漏就消失了.

因此,我的问题是,当重写rendererComponent方法时人们使用什么样的代码,假设一个人拥有自己的单元格渲染器?

swing scala jtable tablecellrenderer

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

解析scala中嵌套元组的错误

在scala中编写以下代码时

var m = Map((0,1) -> "a")
m += ((0,2), "b") // compilation error
Run Code Online (Sandbox Code Playgroud)

我收到了错误

type mismatch;
 found   : Int(0)
 required: (Int, Int)

然而,将元组的语法从改变(X,Y)(X -> Y)工作

var m = Map((0,1) -> 'a)
m += ((0,2) -> 'b) // compiles file
Run Code Online (Sandbox Code Playgroud)

即使

((0,1).getClass == (0 -> 1).getClass) // is true
(0,1).isInstanceOf[Tuple2[_,_]] && (0 -> 1).isInstanceOf[Tuple2[_,_]] // both true
Run Code Online (Sandbox Code Playgroud)

这是为什么?scala认为我的嵌套元组是什么?

syntax scala tuples

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

Java/Scala BigInteger Pasting

我有一个Java BigInteger类的问题:我无法将大值粘贴到BigInteger中.例如,假设我想为此数字指定一个BigInteger:

26525285981219105863630848482795

我无法直接分配它,因为编译器认为它是一个整数:

val bi = 26525285981219105863630848482795 //compile error
Run Code Online (Sandbox Code Playgroud)

但我希望它是一个BigInteger.有没有办法可以直接将其粘贴到源代码中?如果没有这种方式,那么在Scala中是否有一种方法,它有一个更容易使用的BigInt类?谢谢您的帮助.

java scala biginteger bigint

9
推荐指数
2
解决办法
5880
查看次数

Scala actor应用程序的奇怪GC行为

我有一个使用相当多的演员的应用程序:准确地说是25,000.它使用Scala 2.7.7并在jdk6_u18上运行.它基本上监听和处理市场数据,并且几乎没有状态.

它从每天上午8点02分开始,并在一小时内崩溃了OutOfMemoryError."啊哈"你说,"你有内存泄漏!" 除了当我重新启动它说,它从来没有,永远再次崩溃的一天的休息!尽管美国市场在下午2:30开放,但GC和CPU开销都有所上升.

一些轶事发现:

  • 它在Solaris上运行.当我用在Linux上运行它,它永远不会崩溃可言.
  • 我已经尝试搞乱代堆大小调整,分配更多内存等等.我认为没有区别
  • 当我verbose:gc打开时,收集器的行为似乎有所不同

一些问题出现了:

  1. 为什么Linux和Solaris之间的程序行为会有所不同?
  2. 为什么在8.02开始和8.42开始之间的行为会有所不同?
  3. 我听说演员库有一些内存泄漏问题.他们是什么时候,他们什么时候修好了,我怎么能发现这里有什么"相似"的东西?(在jhat中寻找的东西等)
  4. 有没有人知道可能会发生什么?

我现在正试图G1看看这是否有所不同.我明天会更新这个问题!

G1的一些输出带有详细:gc on

我想我刚刚抓住了这个行为:

600.290:[全GC 255M-> 144M(256M),1.5772616秒]
602.084:[GC暂停(年轻)227M-> 145M(256M),0.0556769秒]
602.418:[全GC 254M-> 144M(256M),1.6415216秒]
604.279:[GC暂停(年轻)227M-> 145M(256M),0.0415157秒]
604.602:[全GC 255M-> 145M(256M),1.6041762秒]
606.422:[GC暂停(年轻)227M-> 145M(256M) ),0.0237441秒]
606.710:[全GC 254M-> 145M(256M),1.6022185秒]

然后稍后(你可以看到完整的GC需要更长的时间并且回收更少)

849.084:[全GC 254M-> 176M(256M),1.9658754秒]
851.191:[GC暂停(年轻)228M-> 176M(256M),0.0218611秒]
851.414:[全GC 254M-> 176M(256M),1.9352357秒]
853.492:[GC暂停(年轻)228M-> 176M(256M),0.0224688秒]
853.716:[全GC 254M-> 176M(256M),1.9339705秒]
855.793:[GC暂停(年轻)228M-> 176M(256M) ),0.0215707秒]
856.009:[全GC 254M-> 176M(256M),1.9805797秒]
858.137:[GC暂停(年轻)228M-> …

garbage-collection jvm scala out-of-memory actor

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

在Scala 2.7.5中将元素附加到List的非弃用方法?

如何List在Scala 2.7.5中添加元素,而无需创建新元素List而不使用已弃用的解决方案.

scala list deprecated

9
推荐指数
3
解决办法
2万
查看次数

如何声明scala方法,以便可以使用varargs样式从Java调用它

我在scala库类中有两个简单的方法:

class Foo {
  def bar(args : String*) : Unit = println("Foo.bar with: " + args)
  def bar(args : Array[String]) : Unit = bar(args.toSeq : _*)
}
Run Code Online (Sandbox Code Playgroud)

这一切都编译得很好.然后我把它放在一个库中foo.jar并尝试编译以下Java:

import Foo
public class Test {

    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.bar("Hello", "World"); //DOES NOT COMPILE
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用以下内容替换违规行:

foo.bar(new String[] { "Hello", "World" }); //OK
Run Code Online (Sandbox Code Playgroud)

但这似乎打败了这一点.如何使用类似Java varargs的语法从Java调用它?

java interop scala variadic-functions

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

在Scala中嵌入XML(和其他语言?)

我想知道如何实现scala.xml库,Elem从XML中获取-instance.

所以我可以写:

val xml = {
  <myxml>
    Some wired text withoud "'s or code like
    import x
    x.func()
    It's like a normal sting in triple-quotes.
  </myxml>
}

xml.text

String = 
 "
    Some text wired withoud "'s or code like
    import x
    x.func()
    It's like a normal sting in triple-quotes.
  "
Run Code Online (Sandbox Code Playgroud)

看一下源代码并没有给我一些见解,这是如何实现的."XML检测"是一种(硬)scala语言功能还是内部DSL?因为我想建立我自己的东西:

var x = LatexCode {
  \sqrt{\frac{a}{b}}
}

x.toString

"\sqrt{\frac{a}{b}}"
Run Code Online (Sandbox Code Playgroud)

要么

var y = PythonCode {
  >>> import something
  >>> something.func()
}

y.toString
"""import something ...""" …
Run Code Online (Sandbox Code Playgroud)

dsl scala

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