在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
我正在尝试实现一个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的这种语法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.谁能解释一下?
我一直在使用传统的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方法时人们使用什么样的代码,假设一个人拥有自己的单元格渲染器?
在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认为我的嵌套元组是什么?
我有一个Java BigInteger类的问题:我无法将大值粘贴到BigInteger中.例如,假设我想为此数字指定一个BigInteger:
26525285981219105863630848482795
我无法直接分配它,因为编译器认为它是一个整数:
val bi = 26525285981219105863630848482795 //compile error
Run Code Online (Sandbox Code Playgroud)
但我希望它是一个BigInteger.有没有办法可以直接将其粘贴到源代码中?如果没有这种方式,那么在Scala中是否有一种方法,它有一个更容易使用的BigInt类?谢谢您的帮助.
我有一个使用相当多的演员的应用程序:准确地说是25,000.它使用Scala 2.7.7并在jdk6_u18上运行.它基本上监听和处理市场数据,并且几乎没有状态.
它从每天上午8点02分开始,并在一小时内崩溃了OutOfMemoryError."啊哈"你说,"你有内存泄漏!" 除了当我重新启动它说,它从来没有,永远再次崩溃的一天的休息!尽管美国市场在下午2:30开放,但GC和CPU开销都有所上升.
一些轶事发现:
verbose:gc打开时,收集器的行为似乎有所不同一些问题出现了:
我现在正试图G1看看这是否有所不同.我明天会更新这个问题!
我想我刚刚抓住了这个行为:
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-> …
如何List在Scala 2.7.5中添加元素,而无需创建新元素List而不使用已弃用的解决方案.
我在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调用它?
我想知道如何实现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)