【问题标题】:Scala Assertion unknown parameter on case class案例类上的Scala断言未知参数
【发布时间】:2021-10-30 18:04:16
【问题描述】:

假设我有下面的案例类,它直接转换一个 db 表,并且在创建新行时将随机生成 id。

case class Test(id: UUID, name: String)

现在查看测试,我需要从 Test 中检索一行并与它进行比较

val test1 = (...., "testName")

但是我没有第一个参数,因为它是随机创建的,我想以某种方式忽略它...

我试过了

test1 = (_, "testName")

但它无效。

有什么方法可以在 Scala 中忽略案例类参数?

谢谢!

【问题讨论】:

  • 您想比较忽略一个参数的案例类实例,是吗?一种简单的方法是复制参数中的固定值以忽略。
  • 在@GaëlJ 的方法中,equals 将不再起作用,因此您需要创建一个仅比较第二个参数的自定义比较方法。
  • @ComDubh 你是什么意思equals 将不再起作用? @Silvio 下面的回答正是我的建议。
  • @Silvio 定义了一个新方法 myEquality 来测试仅基于 name 字段的相等性。这就是我所指的(“自定义比较方法”)。 @Gael,你没有提到这一点,但也许是假设的。

标签: scala


【解决方案1】:

假设我们有

case class Test(id: UUID, name: String)

这是一个测试Test 的两个实例是否相等的函数,忽略id 字段。

def myEquality(a: Test, b: Test): Boolean =
  a == b.copy(id=a.id)

我们不能明确告诉 Scala 忽略一个字段,但我们可以肯定地将该字段模拟为正确的值。而且由于这些是案例类(即不可变的),我们不能通过这个简单的技巧来搞乱任何其他不相关的数据结构。

【讨论】:

  • 非常感谢西尔维奥!
【解决方案2】:

要回答提出的问题,答案是否定的。案例类实例由其字段的值定义。它们不像普通类那样具有身份属性。所以实例化一个缺少参数的案例类是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多