【发布时间】:2015-10-16 16:19:01
【问题描述】:
我是 Scala 编程的新手,我非常喜欢代码的可组合程度。我想编写一些处理两个可相互转换的相关对象的特征,并通过继续扩展该特征来构建更多功能,以便在创建对象时可以为我的泛型指定相关类型。这是我正在谈论的代码类型的工作玩具示例:
trait FirstConverter[First] {
def toFirst: First
}
trait SecondConverter[Second] {
def toSecond: Second
}
trait TwoWayConverter[First <: SecondConverter[Second], Second <: FirstConverter[First]] {
def firstToSecond(x: First) = x.toSecond
def secondToFirst(x: Second) = x.toFirst
}
trait RoundTripConverter[First <: SecondConverter[Second], Second <: FirstConverter[First]] extends TwoWayConverter[First, Second] {
def firstToFirst(x: First) = secondToFirst(firstToSecond(x))
def secondToSecond(x: Second) = firstToSecond(secondToFirst(x))
}
case class A(s: String) extends SecondConverter[B] {
def toSecond: B = B((s.toInt) + 1)
}
case class B(i: Int) extends FirstConverter[A] {
def toFirst: A = A((i * 2).toString)
}
object ABConverter extends RoundTripConverter[A, B]
object Main {
def main(args: Array[String]): Unit = {
println(ABConverter firstToSecond A("10")) // 11
println(ABConverter secondToFirst B(42)) // 84
println(ABConverter firstToFirst A("1")) // 4
println(ABConverter secondToSecond B(2)) // 5
}
}
虽然这可行,但我不确定它是否是惯用的 Scala。我在问是否有任何技巧可以使类型定义更简洁,以及我是否可以以某种方式只定义一次类型限制并让它们被扩展其他特征的多个特征使用。
提前致谢!
【问题讨论】:
-
也许只是文体上的小毛病:我不喜欢这段代码中
toInt或toString的后缀操作 - 我不认为它们在这里添加任何东西,对我来说它们只会损害可读性.特别是我更喜欢foo.s.toInt + 1而不是(s toInt) + 1。 -
@Suma - 是的,我还在学习什么时候用这个句号,什么时候不用。将它们添加回去。
-
@Wolfgang - 我曾经在同一个方向搜索过。看,我得到了什么:stackoverflow.com/questions/1154571/…