模式匹配采用输入并使用unapply
函数进行分解。所以在你的情况下,unapply(4)
将不得不返回总和为4的两个数字。然而,有很多对的总和为4,所以该函数不知道该怎么做。
你需要的是2
可以以某种方式访问unapply
函数。存储的2
一个特例类将这项工作:
case class Sum(addto: Int) {
def unapply(i: Int) = Some(i - addto)
}
val Sum2 = Sum(2)
val Sum2(x) = 5 // x = 3
(这将是很好能够像做val Sum(2)(y) = 5
紧凑性,但斯卡拉不允许参数提取;见here)
[编辑:这是一个有点傻,但你实际上可以做以下太:
val `2 +` = Sum(2)
val `2 +`(y) = 5 // y = 3
]
编辑:head::tail
的工作原理是,有一种方法可以从列表的尾部拆分头部。
关于::
与+
相比,没有什么特别的特殊之处:如果您有预先确定的想法来确定打破数字的方式,则可以使用+
。例如,如果你想+
表示“劈成两半”,那么你可以这样做:
object + {
def unapply(i: Int) = Some(i-i/2, i/2)
}
,并用它喜欢:
scala> val a + b = 4
a: Int = 2
b: Int = 2
scala> val c + d = 5
c: Int = 3
d: Int = 2
编辑:最后,this解释说,当模式匹配,A op B
意味着与op(A,B)
相同的东西,这使得语法看起来不错。
来源
2011-07-18 20:01:49
dhg
为什么不使用'y-2'(当y = 4时)? –
这更多的是好奇心,所以我没有任何具体的例子,但我想这对于更复杂的类很好。 – Dylan