Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 隐式参数的有效用法_Scala_Implicit - Fatal编程技术网

Scala 隐式参数的有效用法

Scala 隐式参数的有效用法,scala,implicit,Scala,Implicit,下面的Scala教程展示了如何使用隐式方法根据类型提供适当的缺少成员(add和unit)。编译器将在作用域中选择正确的隐式对象。该库还将其与List.sortBy和Ordering或List.sum和Numeric一起使用 但是,B类a中的以下用法是否有效/建议使用隐式参数(而不是在a类中不使用隐式参数): 在这里,我主要使用隐式函数来保存自己在沿着堆栈传递参数时在调用站点的一些键入 它看起来不像隐式的惯用用法,隐式通常适合于类型类和依赖项注入。在一个没有成员的班级里转悠是毫无意义的 在调用(新

下面的Scala教程展示了如何使用隐式方法根据类型提供适当的缺少成员(add和unit)。编译器将在作用域中选择正确的隐式对象。该库还将其与
List.sortBy
Ordering
List.sum
Numeric
一起使用

但是,B类a中的以下用法是否有效/建议使用隐式参数(而不是在a类中不使用隐式参数):


在这里,我主要使用隐式函数来保存自己在沿着堆栈传递参数时在调用站点的一些键入

它看起来不像隐式的惯用用法,隐式通常适合于类型类和依赖项注入。在一个没有成员的班级里转悠是毫无意义的

在调用
(新B.foo
之前,定义类型为
I
的隐式val或对象也更常见


说到这里,你提供了一个非常抽象的例子。因此,不难想象一个遵循类似模式的合理隐式用例。

这是一个非常好的用例。实际上,当范围决定要使用的参数时,我建议这样做。它提供了一种优雅的方式将某种上下文传递到插件类中,以便实用程序函数使用该上下文。例如:

trait Context

object UtilityLib {
  def performHandyFunction(implicit x : Context) : SomeResult = ...
}

trait Plugin {
   def doYourThing(implicit ctx : Context) : Unit
}

class MyPlugin extends Plugin {
  def doYourThing(implicit ctx : Context) : Unit = {
    UtilityLib.performHandyFunction
  }
}

SomePluginAPI.register(new MyPlugin)

你可以看到一个例子。查看Migration类及其MigrationContext。

虽然根据语言规则是有效的,但我个人不会在这些情况下使用隐式。我会使用它们来:1)根据调用环境改变方法的行为。2) 对调用施加一个要求,该要求取决于周围类的类型参数或方法本身。但是,这只是我个人的观点,即何时以及如何使用它们。也许还有其他有效和有用的模式。是的,我可以看出这是多么有用。提出这个问题的用例大致是这样的,尽管我没有想到“上下文”这个词。。。
trait Context

object UtilityLib {
  def performHandyFunction(implicit x : Context) : SomeResult = ...
}

trait Plugin {
   def doYourThing(implicit ctx : Context) : Unit
}

class MyPlugin extends Plugin {
  def doYourThing(implicit ctx : Context) : Unit = {
    UtilityLib.performHandyFunction
  }
}

SomePluginAPI.register(new MyPlugin)