正如我一直所理解的那样,对程序状态的任何更改(或与IO有关的任何内容)都是副作用.无论是在全局变量中还是在调用该方法的对象的私有字段中发生更改都无关紧要.因此,所有不返回任何东西的方法都不做任何事情或产生副作用.
我的困惑来自我们的一位大学教师(他仍然是学生,因此还不是无所不知;))告诉我,安装者没有副作用.
有没有办法让方法总是返回调用它的同一个类的类型?
让我解释:
class Shape {
var mName: String = null
def named(name: String): Shape = {
mName = name
this
}
}
class Rectangle extends Shape {
override def named(name: String): Rectangle = {
super.named(name)
this
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但有没有办法在不必覆盖named
所有子类中的函数的情况下执行此操作?我正在寻找这样的东西(不起作用):
class Shape {
var mName: String = null
def named(name: String): classOf[this] = { // Does not work but would be great
mName = name
this
}
}
class Rectangle extends Shape {
}
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?还是不可能?
是否有支持从注释生成一些标准单元测试的框架?我想到的一个例子是:
@HasPublicDefaultConstructor
public class Foo {
}
Run Code Online (Sandbox Code Playgroud)
这显然会用于自动生成一个单元测试,用于检查Foo是否具有默认构造函数.我是唯一一个想到这样的人吗?虽然我对Java最感兴趣,但其他语言的解决方案肯定也很有趣.
编辑:回应S.Lott的回答,让我澄清一下:
我正在尝试测试该类是否具有默认构造函数.(当然这只是一个例子.)我可以通过编写测试来做到这一点,但我觉得这很乏味.所以我正在寻找一种工具,可以在编译时处理注释(通过APT)并为我生成测试.这样的事情存在吗?如果没有,你认为这是个好主意吗?
我正在编写一个应用程序,需要从文件中读取字符串列表,将它们保存在数据结构中,然后按前缀查找这些字符串.字符串列表只是给定语言中的单词列表.例如,如果搜索函数将"stup"作为参数,则应返回["stupid","stupidity","stupor"...].它应该在O(log(n)*m)时间内完成,其中n是数据结构的大小,m是结果的数量,应该尽可能快.内存消耗现在不是一个大问题.我在python中写这个,所以如果你能指出一个合适的数据结构(最好)用python包装器在c中实现它会很棒.
给出以下代码:
case class ChangeSet(field:String, from:Object, to:Object)
private var changed:List[ChangeSet] = Nil
def change(field:String, from:Object, to:Object) {
changed.find{ case ChangeSet(field,_,_) => true } match {
case Some(ChangeSet(field,to,_)) => // do stuff
case Some(_) => // do stuff
case _ => // do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
给我带来麻烦的是Some(ChangeSet(field,to,_))
.
它编译但似乎正在发生的事情是Scala将其填充为通配符的占位符.我的假设基于以下事实:当我执行以下操作时,Some(ChangeSet(field,to,to))
我得到了错误to is already defined as value
.
我想要的是to
从方法参数创建一个ChangeSet对象.
那可能吗?
我最近一直在玩scala模式匹配,并且想知道是否有一种方法可以在case语句中创建一个提取器.以下代码有效,但您必须先定义提取器并将其分配给val:
val Extr = "(.*)".r
"test" match {
case Extr(str) => println(str)
}
Run Code Online (Sandbox Code Playgroud)
我想做什么,或者我希望有人确认是不可能的,是这样的:
"test" match {
case ("(.*)".r)(str) => println(str)
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果scala团队的任何人正在阅读这个:实现这个是否可行?
我想问一下你是否有任何经验{和,或}可以指向我与Emacs的项目管理扩展,它与{Scala,Ensime,SBT}配合得很好.如果它不需要太多的黑客攻击也会令人惊讶.我过去做了一些计划,但我对Emacs平台没什么经验.
基本上,通过项目管理,我的意思主要是"将文件绑定到项目中"然后在它们之间进行搜索(并且仅在它们之间).
感谢您花时间阅读并回答!
有没有办法在模式匹配中使用宏的参数?我想这样做:
def extr(X:AnyRef) = macro extrImpl
def extrImpl(c:Context)(X:c.Expr[AnyRef]):c.Expr[AnyRef] = {
import c.universe._
val tree = reify {
new {
def unapply(x:String):Option[String] = x match {
case X.splice => Some(x) //error
case _ => None
}
}
}.tree
c.Expr(c.typeCheck(tree))
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是编译器说"需要稳定的标识符,但X.splice发现了".通常,人们可以通过首先分配val来解决这个问题,例如:
val XX = X.splice
Run Code Online (Sandbox Code Playgroud)
但当然,这也不适用于拼接.
在Akka(或Scala 2.10中的标准库)中是否有一种方法可以将Future[A]
可能失败的方法转换为Future[Either[Exception,A]]
?我知道你可以写
f.map(Right(_)).recover {
case e:Exception => Left(e)
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个如此常见的任务,我想知道我是否忽略了一些东西.我对Scala 2.9/Akka和Scala 2.10的答案很感兴趣.
最近我想在一个小项目中尝试Scala 2.9中的一些新功能.我想用maven来构建它.我如何告诉Maven使用最新的每晚Scala 2.9版本?如果有人知道如何用sbt而不是maven来做这件事,那也会很好.
scala ×7
sbt ×2
scala-2.10 ×2
scala-2.9 ×2
akka ×1
annotations ×1
automation ×1
definition ×1
dictionary ×1
emacs ×1
ensime ×1
future ×1
inheritance ×1
java ×1
lookup ×1
macros ×1
maven ×1
oop ×1
python ×1
scala-macros ×1
side-effects ×1
syntax ×1
types ×1
unit-testing ×1