Scala 提取器
在Scala 中,Extractor被定义为一个对象,它有一个名为unapply的方法作为它的一部分。此方法提取一个对象并返回属性。此方法也用于模式匹配和偏函数。 Extractors 还解释了apply方法,它接受参数并构造一个对象,因此它有助于构造值。 unapply方法颠倒了apply方法的构造过程。 unapply 方法的返回类型可以选择如下:
- 如果它是一个检查过程,则返回一个布尔类型。
- 如果过程只返回一个 T 类型的子值,则返回 Option[T]。
- 如果过程返回 T1, T2, ..., Tn 类型的各种子值,则返回一个可选元组,即 Option[(T1, T2, ..., Tn)]。
- 如果该过程返回的值数量不可预测,则可以使用返回 Option[Seq[T]] 的unapplySeq定义提取器。
例子 :
Scala
// Scala program of extractors
// Creating object
object Name
{
// Main method
def main(args: Array[String])
{
// Defining apply method
def apply(firstname: String, lastname: String) =
{
firstname +"kumari"+ lastname
}
// Defining unapply method
def unapply(x: String): Option[(String, String)] =
{
// Applying a method split
val y = x.split("kumari")
if (y.length == 2)
{
Some(y(0), y(1))
}
else
None
}
// Displays output
println ("The Apply method returns : " +
apply("Nidhi", "Singh"))
println ("The Unapply method returns : " +
unapply("NidhikumariSingh"))
}
}
Scala
// Scala program of extractors
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Defining apply method
def apply(q: Double): Double = q * 10
// Defining unapply method
def unapply(r: Int): Option[Int] = {
if (r % 5 == 0)
{
Some(r * 5)
}
else
None
}
// Displays output
println ("The Apply method returns : " + apply(20))
println ("The Unapply method returns : " + unapply(35))
}
}
Scala
// Scala program of extractors
// with pattern matching
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Assigning value to the
// object
val x = GfG(25)
// Displays output of the
// Apply method
println(x)
// Applying pattern matching
x match
{
// unapply method is called
case GfG(y) => println("The value is: "+y)
case _ => println("Can't be evaluated")
}
}
// Defining apply method
def apply(x: Double) = x / 5
// Defining unapply method
def unapply(z: Double): Option[Double] =
if (z % 5 == 0)
{
Some(z/5)
}
else None
}
Scala
// Scala program of extractors
// to return a Boolean type
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Defining unapply method
def unapply(x:Int): Boolean = {
if (x % 3 == 0)
{
true
}
else
false
}
// Displays output in Boolean type
println ("The Unapply method returns : " + unapply(12))
println ("The Unapply method returns : " + unapply(35))
}
}
输出:
The Apply method returns : NidhikumariSingh
The Unapply method returns : Some((Nidhi, Singh))
此处,此示例显示了 Name 的提取器对象。对象 Name 定义了两个方法apply和unapply 。 apply 方法接受括号中指定的参数,并创建方法中指定的值。返回名字和姓氏以及中间的kumari (中间名)。 unapply 方法会破坏指定的参数并将 firstname 对象返回到提取器中。如果作为参数传递了名字和姓氏,则返回一对字符串,否则返回无。
例子 :
斯卡拉
// Scala program of extractors
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Defining apply method
def apply(q: Double): Double = q * 10
// Defining unapply method
def unapply(r: Int): Option[Int] = {
if (r % 5 == 0)
{
Some(r * 5)
}
else
None
}
// Displays output
println ("The Apply method returns : " + apply(20))
println ("The Unapply method returns : " + unapply(35))
}
}
输出:
The Apply method returns : 200.0
The Unapply method returns : Some(175)
此处,此示例显示了 GFG 的提取器对象。对象 GFG 定义了两个方法apply和unapply 。 apply 方法接受 double 类型的参数。当我们调用apply方法时,传递的参数乘以10并返回乘数。如果传递的值可被5整除,而不是传递的值乘以5并返回 that(r*5),则unapply方法会中断参数,否则不返回任何值。
Scala 提取器的使用
- 使用带有模式匹配的提取器:
提取器可用于模式匹配。在 Pattern Matching 中比较 Extractor 的 Object 时, unapply方法会自动执行。
例子:
斯卡拉
// Scala program of extractors
// with pattern matching
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Assigning value to the
// object
val x = GfG(25)
// Displays output of the
// Apply method
println(x)
// Applying pattern matching
x match
{
// unapply method is called
case GfG(y) => println("The value is: "+y)
case _ => println("Can't be evaluated")
}
}
// Defining apply method
def apply(x: Double) = x / 5
// Defining unapply method
def unapply(z: Double): Option[Double] =
if (z % 5 == 0)
{
Some(z/5)
}
else None
}
输出:
5.0
The value is: 1.0
- 注意: Case 类中已经有一个 Extractor,因此它可以与 Pattern Matching 一起使用。
- 使用提取器进行测试:
为了使用 Extractor 进行测试,返回一个 Boolean 类型。
例子:
斯卡拉
// Scala program of extractors
// to return a Boolean type
// Creating object
object GfG
{
// Main method
def main(args: Array[String])
{
// Defining unapply method
def unapply(x:Int): Boolean = {
if (x % 3 == 0)
{
true
}
else
false
}
// Displays output in Boolean type
println ("The Unapply method returns : " + unapply(12))
println ("The Unapply method returns : " + unapply(35))
}
}
输出:
true
false
在这里,对象GFG定义了一个 unapply 方法。在调用unapply方法期间,如果值除以 3 则传递参数,否则返回true否则返回false 。