【发布时间】:2015-01-06 05:14:51
【问题描述】:
我的目的是在 Scala 中创建一个函数,它接受某种动态查询(类似于模式匹配中的case 表达式)并在List 中返回匹配的实例。假设列表由case class Person 的实例组成,这些实例几乎没有不同类型的属性。该函数应该能够接受某些字段的值的动态组合,并返回匹配的Persons。我正在专门寻找一个干净的解决方案。使用此类函数的一种可能方法是将具有匿名类型的对象作为查询(“模式”)传递:
def find(?): List<Person> = { ? }
val matches = find(new { val name = "Name"; val gender = Gender.MALE })
理想情况下,我想开发一种简洁的方式来传递条件,而不是具体的值,但这不是必需的。因为我正在学习 Scala,所以我不知道实现这样一个东西的所有技术。在 C# 中,我使用匿名类型(类似于上面的第二行代码)和dynamic 参数来实现类似的东西。 Scala 中什么是干净优雅的解决方案?
【问题讨论】:
-
匿名谓词不够清晰的解决办法?
xs.find(person => person.name == "Name" && person.gender == Gender.MALE)? -
如果条件是静态的,它们就是。在运行前,并不确定,例如是否应该检查名称。
-
您所描述的内容类似于 ScalaTest 的匹配器,您可以在其中编写类似
person should have ('name ("Name"), 'gender (Gender.MALE))的内容。虽然匹配器用于断言,但您可以根据自己的目的调整实现。看看“使用 have 检查任意属性”:scalatest.org/user_guide/matchers_quick_reference
标签: scala pattern-matching anonymous-types