Scala中的隐式参数和转换

在浏览了有关Habr的先前文章之后, tytytyts不能快速了解Scala中的隐式功能。 让我们尝试一起解决。


因此,Scala中的隐式允许您避免调用方法或对变量的显式引用,而是允许编译器自身查找必要的隐式数据。

例如,我们可以编写一个从Float转换为Int的函数(FloatToInt),而不是显式调用此函数,编译器将为我们隐式完成此操作:

def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F)) 

感到困惑? 让我们整理一切。

因此,今天我们来看两个隐式类别,即:

  • 隐式参数 (值)。 它们由隐式声明的编译器值自动传递。
  • 隐式转换 如果期望参数的类型与输入参数不匹配,则编译器会在此情况下在标记为隐式且具有这种情况下所需的期望参数和输入参数的范围内搜索任何方法,并自动将其传递。

隐式参数


隐式参数是在隐式关键字之后的功能参数。 这意味着,如果在调用函数时未传递任何值,则编译器将亲自搜索隐式参数并将其传递给我们。

例如,以下函数将隐式参数值作为输入并将其加倍:

 def double(implicit value: Int) = value * 2 

没有隐式参数,它将失败并显示错误:

 def double(implicit value: Int) = value * 2 println(double) // error: could not find implicit value for parameter value 

传递一个显式参数,它将起作用:

 def double(implicit value: Int) = value * 2 println(double(3)) // 6 

使用隐式参数,它将看起来像这样:

 def double(implicit value: Int) = value * 2 implicit val multiplier = 2 println(double) // 4 

但是您需要注意:

 def double(implicit value: Int) = value * 2 implicit val multiplier = 2 implicit val multiplier2 = 1 println(double) // error: ambiguous implicit values 

最后,通过def作为隐式参数的示例:

 def double(implicit value: Int) = value * 2 val cappucinoLarge: Boolean = false implicit def cappucinoPrice: Int = if (cappucinoLarge) 200 else 100 println(double) // 200 

即 最终我们会成功
 double(cappucinoPrice()) 

语法注释:

 def func1(implicit value1: Int) // value1  def func2(implicit value1: Int, value2: Int) // value1  value2  def func3(value1: Int, implicit value2: Int) //   def func4(value1: Int)(implicit value2: Int) //  value2  def func5(implicit value1: Int)(value2: Int) //   def func6(implicit value1: Int)(implicit value2: Int) //   

隐式转换


返回从Float到Int的示例:

 def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F)) 

当调用double时,我们的预期参数(Int)与输入参数(Float)的类型不匹配。 因此,编译器将在范围内寻找任何方法,这些方法标记为隐式,并带有在这种情况下所需的预期参数(Int)和输入参数(Float)。 查找FloatToInt,执行转换,然后将所需的值进一步加倍。

现在,我希望它变得更加清晰。 掌握Scala的所有成功!

Source: https://habr.com/ru/post/zh-CN451358/


All Articles