- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
什么是unapply
方法是Scala?它是如何工作的?
我知道 OCaml 等其他语言中的模式匹配,通常你几乎无法控制它。 Scala 在提供方面是独一无二的吗unapply
方法,或者是否有其他语言提供控制模式匹配的机制?
最佳答案
在斯卡拉 unapply
也称为提取器方法,例如考虑这个
scala> object SomeInteger {
|
| def apply(someInt: Int): Int = someInt
|
| def unapply(someInt: Int): Option[Int] = if (someInt > 100) Some(someInt) else None
| }
defined module SomeInteger
scala> val someInteger1 = SomeInteger(200)
someInteger1: Int = 200
scala> val someInteger2 = SomeInteger(0)
someInteger2: Int = 0
scala> someInteger1 match {
| case SomeInteger(n) => println(n)
| }
200
scala> someInteger2 match {
| case SomeInteger(n) => println(n)
| case _ => println("default")
| }
default
default
因为
SomeInteger
的unapply方法返回
None
而不是
SomeInteger(n)
.
List(1,2,3,4) match {
case head :: tail => doSomething()
case first :: second :: tail => doSomethingElse
case Nil => endOfList()
}
unapply
方法被定义。
关于scala - Scala 中的 unapply 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099381/
在 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
我是一名优秀的程序员,十分优秀!