我怎么能转换case class到一个Map地方的领域case class成为关键?
例如:
case class Person(name: String, age: Int)
val p = Person("dude", 89)
val map = p.toMap // <-- ???
Run Code Online (Sandbox Code Playgroud)
这样map等于下面的地图:
Map("name" -> "dude", "age" -> 89)
Run Code Online (Sandbox Code Playgroud) 假设我有一个接口Thing:
abstract class Thing[A](a_thing: A) {
def thingA = a_thing
}
Run Code Online (Sandbox Code Playgroud)
我实现Thing如下:
class SpecificThing(a: String) extends Thing[String](a)
Run Code Online (Sandbox Code Playgroud)
此外,假设我有一个函数,它接受一个Thing和一个lambda做的事情Thing作为参数:
def doSomething[A](fn: Thing[A] => A, t: Thing[A]) : A = fn(t)
Run Code Online (Sandbox Code Playgroud)
现在,让我们使用这些东西:
val st = new SpecificThing("hi")
val fn1: (Thing[String]) => String = (t: Thing[String]) => { t.thingA }
println(doSomething(fn1, st))
Run Code Online (Sandbox Code Playgroud)
这打印hi.到现在为止还挺好.但我很懒,而且我不喜欢打字这么多,所以我将程序改为以下内容:
type MyThing = Thing[String]
val st = new SpecificThing("hi")
val fn2: (MyThing) => String = (t: MyThing) => { t.thingA …Run Code Online (Sandbox Code Playgroud) 这就是我想要做的 -
class A(some args) {
var v: SomeType = null
def method1(args) = {
v = something1
...
method3
}
def method2(args) = {
v = something2
...
method3
}
def method3 = {
// uses v
}
}
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,方法1和2是互斥的,并且它们中的任何一个在A的实例的生命周期中恰好被调用一次.此外,v被分配一次.我宁愿把它变成val.但是因为我需要method2或method3的上下文来初始化v,所以我不能在构造函数中这样做.
怎么能实现这种"val"行为?我可以考虑修改method1和method2来应用方法,但我不喜欢这个想法.此外,方法1和2具有相同的参数签名(因此应用将需要更多信息来区分这两种类型的调用).
我正在尝试编写一个函数myfoo,它采用Int和一个int列表,验证int元素是否在列表中.如果int在列表中,它应返回"true",否则返回false.我已经写了这个函数,但是当我编译它时会返回这个错误:
error: type mismatch;
found : Unit
required: Boolean
breakable { for (i <-l) {
^
one error found*
Run Code Online (Sandbox Code Playgroud)
这是我的计划:
import scala.util.control.Breaks._
object findEl extends App{
def myfoo (x:Int,l:List[Int]):Boolean={
breakable { for (i <-l) {
i match {
case a if (a==x) => true
case _ => false
break
}
}
}
}
println(myfoo(1,List(1,2,3,4))) //should print "true"
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决?:)