假设我有:
object test{
abstract class Base
然后扩展Base的两个案例类alpha和beta,写成:
case class alpha(num: Int, other: String) extends Base
case class beta(num:Int, other_two: String) extends Base
然后说我有一个Base对象列表List[Base]
。
其中一些对象是alpha版,有些是beta版。我想按字段num
(alpha和beta对象之间的公共字段)对它们进行排序。
从我所阅读/谷歌搜索的每个人和他们的祖母建议做以下事情:
val i: List[Base] = List(alpha(4,"test"),beta(2,"test_two")).sortby(_.num)
然而,这不起作用。工作是什么:
val j: List[Base] =List(alpha(4,"test"),beta(2,"test_two")).sortWith(num(_) < num(_))
}
我的问题是为什么前者不起作用,后者为什么起作用?
答案 0 :(得分:1)
您可以在基类中声明子类应该具有num
值:
abstract class Base {
val num: Int
}
然后使用您的第二个变体
val i: List[Base] = List(alpha(4,"test"),beta(2,"test_two")).sortBy(_.num)
答案 1 :(得分:1)
您的第一个示例不起作用,因为<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script language="javascript">
function singleRbtnSelect(chb) {
$(chb).closest("table").find("input:radio").prop("checked", false);
$(chb).prop("checked", true);
}
</script>
没有Base
成员。尽管.num
的所有元素都可能包含List
个成员,但已告知编译器将它们视为.num
类型,因此Base
无效。
_.num
示例仅在方法sortWith()
存在时才有效。这样的事情。
num()
现在第二个示例编译并运行,因为def num(x: Base): Int = x match {
case a: alpha => a.num // BTW, class names should be capitalized
case b: beta => b.num
case _ => 0
}
方法正在确定类型并提取num()
成员(如果存在)。但如果是这种情况,那么你的第一个例子也可以起作用。
.num
答案 2 :(得分:0)
使用@Harald建议的解决方案,如果提供的函数修改如下,int one, two, three;
方法将起作用:
sortWith