pro*_*eek 3 parameters constructor scala
我有一个带有两个参数的Scala类,另一个参数构造函数.对于一个参数构造函数,我调用一个方法来获取两个元素的元组,并尝试使用元组作为需要两个参数的构造函数的参数.这是一个例子:
def vals(v:Int) = {
// computation
(v,v) // returns two element tuple
}
class A(a:Int, b:Int) {
def this(v:Int) = {
this(vals(v))
}
}
object Main extends App {
val a = new A(10)
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到类型不匹配错误.我在scala tuple解压缩中找到了一个解决方案,该解决方案适用于函数调用,但不适用于构造函数.
def foo(x: Int, y: Int) = x * y
def getParams = {
(1,2) //where a & b are Int
}
object Main extends App {
println((foo _).tupled(getParams))
println(Function.tupled(foo _)(getParams))
}
Run Code Online (Sandbox Code Playgroud)
怎么能解决这个问题?
为类创建一个伴随对象,并为其添加一些"工厂"("apply")方法,然后抛弃额外的构造函数,转而使用工厂方法.vals如果你愿意的话,你也可以在那里包括方法以保持一致(尽管你可以将它定义在其他地方,如果这对你更好).然后你最终得到如下内容:
class A(val a:Int, val b:Int)
object A {
def apply(pair: (Int, Int)): A = new A(pair._1, pair._2)
def apply(v: Int): A = A(vals(v))
def vals(v:Int) = {
// computation
(v,v) // returns two element tuple
}
}
Run Code Online (Sandbox Code Playgroud)
并创建你A的:
scala> val a = A(10)
a: A = A@36d6ec03
scala> a.a
res6: Int = 10
Run Code Online (Sandbox Code Playgroud)
请注意,我将'a'和'b'字段声明为'val'.这使他们可以访问,如a.a上面的行.事实上,我建议制作A一个"案例类",例如.case class(a: Int, b: Int)它会自动为字段添加'val',并为您创建一个伴侣类(使用另一个默认的"apply"方法,两个Ints).您还可以得到实现toString,equals以及hashcode免费的.
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |