📜  Scala 提取器

📅  最后修改于: 2022-05-13 01:55:09.524000             🧑  作者: Mango

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 定义了两个方法applyunapply 。 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 定义了两个方法applyunapply 。 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