- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码:
case class User(id: Int, name: String)
object User{
def unapply(str: String) = Some(User(0, str))
}
Scala 提示“错误:无法解析重载未应用;case class User(id: Int, str: String)”不可以重载unapply吗?
更新: 取消应用较大的元组大小。
case class User(id: Int, str: String)
object User{
def unapply(s: String) = Some((User(0, s), s, 1234))
}
编译器仍然提示“无法解析重载的未应用”
最佳答案
您的 unapply 方法无法用于模式匹配
它适用于
def unapply(arg: <type to match>) : Option[(<matched fields types>)]
(如果只有一个字段则没有元组,如果没有字段则为 bool 值而不是选项)。
User 的标准 unapply 是(Scala 语言规范第 67 页)
def unapply(u: User) =
if (u eq null) None
else Some((u.id, u.name))
您想要的是匹配具有零 ID 的用户,如下所示
user match {case User(name) => ....}
那就是
def unapply(u: User): Option[String] =
if(u eq null || u.id != 0) None
else Some(u.name)
如果你希望字符串可以作为用户进行匹配(这会很奇怪)
def unapply(s: String): Option[User] = Some(User(0, s))
它可以与
"john" match case User(u) => ... // u is User(0, john)
我猜你想要前一个。在这种情况下,您的 apply 和标准方法都是具有相同参数列表(一个 User 参数)的两种方法,因此它们不兼容。这可能被认为有点不幸,因为当方法被称为提取器时,区别元素实际上是结果元组的大小,而不是参数的类型。
但是,您的方法虽然作为提取器无效,但不会导致冲突。我在规范中找不到禁止它的内容。尽管如此,它还是没用,而且有用的方法也不会被允许。
关于scala - 在案例类 : scala 中重载 unapply 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885151/
在 object Sized (在“shapeless/sized.scala”中)有 unapplySeq ,不幸的是它不提供静态检查。例如,下面的代码将在运行时失败并显示 MatchError :
我想要一个提取器来隐式转换它的参数,但它似乎不起作用。考虑这个非常简单的案例: case class MyString(s: String) {} implicit def string2mystri
在下面的代码中,我试图了解 Foo#unapply : Option[Int] 在模式匹配方面的用法。 $ls Test.scala $cat Test.scala object Test { c
显然,提取器对象中的 unapply/unapplySeq 不支持隐式参数。假设这里有一个有趣的参数 a 和一个令人不安的普遍存在的参数 b,在提取 c 时可以很好地隐藏它。 [ 编辑 ]:在我的 i
我有一个从字符串中提取对象的提取器。 case class ItemStructure(id: String, data: String) object ItemStructure { def u
我真的不明白这个小东西。我有一个抽象类 Box 有几个不同类型的子类。例如 abstract class Box class StringBox(val sValue : String) extend
我有以下情况,给定两种类型 MA 和 MB,我希望能够证明它们不仅具有 Applicative 而且它们都具有相同的基础形状。我尝试执行以下操作: type UnapplyM[TC[_[_]], MA
以下代码: object Test { @inline def unapply(i: Int): Option[String] = i match { case 1 => So
我刚刚发现我的提取器中的 unapply 出于某种原因被调用了两次。任何人都知道为什么,以及如何避免它? val data = List("a","b","c","d","e") object Uap
如果我不在 Some 方法中使用 unapply,为什么以下代码不起作用? scala> object T { | def unapply(i:Int) = (i+1,i+2) //Some
Django runserver 提示: You have unapplied migrations; your app may not work properly until they are ap
阅读 this ,我仍然对返回 Boolean 的 unapply() 有疑问。 如果查看 Scala Programming Book (2nd edition),第 602 页。有一个例子: ca
我有以下代码旨在在同一个提取器中定义 unapply 和 unapplySeq test("pattern matching define unapply and unapplySeq") {
鉴于: import shapeless._ import syntax.singleton._ case class Foo(a: String, one: Witness.`1`.T) 为什么要F
我希望能够做到这一点: scala> val Int(i) = "1" i: Int = 1 但是Int没有 unapply方法。 我找到了 this answer它给出了如何向现有对象隐式添加方法的
为什么 Scala 同时具有 unapply 和 unapplySeq?两者有什么区别?我什么时候应该选择其中一种而不是另一种? 最佳答案 无需深入细节并稍微简化一下: 对于常规参数apply构造和u
什么是unapply方法是Scala?它是如何工作的? 我知道 OCaml 等其他语言中的模式匹配,通常你几乎无法控制它。 Scala 在提供方面是独一无二的吗unapply方法,或者是否有其他语言提
我不能在 unapply 上使用泛型吗?提取器的方法以及隐式“转换器”以支持特定于参数化类型的模式匹配? 我想这样做( 注意在 [T] 行 上使用 unapply ), trait StringDec
我尝试创建一个用于模式匹配的 unapply 方法,并尝试使其返回与 Option 不同的内容,但是,Eclipse 将其显示为错误。是否存在 unapply 必须返回 Option[T] 的规则?
考虑以下代码: case class User(id: Int, name: String) object User{ def unapply(str: String) = Some(User(0
我是一名优秀的程序员,十分优秀!