- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
2年前关闭。
Improve this question
到目前为止,Scala 中的隐式参数对我来说并不好看——它太接近全局变量了,但是由于 Scala 似乎是一种相当严格的语言,我开始怀疑我自己的观点:-)。
问题:当隐式参数真正起作用时,您能否展示一个真实(或接近)的好例子。 IOW:比showPrompt
更严重的事情,这将证明这种语言设计是合理的。
或者相反 - 您能否展示可靠的语言设计(可以是想象的),这将使隐式变得不必要。我认为即使没有机制比隐式更好,因为代码更清晰,没有猜测。
请注意,我问的是参数,而不是隐式函数(转换)!
更新
全局变量
谢谢你所有的好答案。也许我澄清了我的“全局变量”反对意见。考虑这样的函数:
max(x : Int,y : Int) : Int
max(5,6);
max(x:5,y:6);
implicits
像这样工作:
x = 5;
y = 6;
max()
max() : Int
{
global x : Int;
global y : Int;
...
}
implicit
发送消息的灵活用法请贴一个反例。我真的很好奇语言设计的纯度;-)。
最佳答案
从某种意义上说,是的,隐式表示全局状态。然而,它们不是可变的,这就是全局变量的真正问题——你不会看到人们提示全局常量,是吗?事实上,编码标准通常要求您将代码中的任何常量转换为常量或枚举,它们通常是全局的。
另请注意,隐式不在平面命名空间中,这也是全局变量的常见问题。它们明确绑定(bind)到类型,因此绑定(bind)到这些类型的包层次结构。
因此,使用您的全局变量,使它们不可变并在声明站点初始化,并将它们放在 namespace 中。它们看起来仍然像全局变量吗?它们看起来仍然有问题吗?
但我们不要止步于此。隐式与类型相关联,并且它们与类型一样具有“全局性”。类型是全局的这一事实是否困扰着您?
至于用例,它们很多,但我们可以根据它们的历史进行简要回顾。最初,afaik,Scala 没有隐式。 Scala 拥有的是 View 类型,这是许多其他语言都有的特性。我们今天仍然可以看到,无论何时你写下诸如 T <% Ordered[T]
之类的东西,表示类型 T
可以看作是一个类型 Ordered[T]
. View 类型是一种在类型参数(泛型)上进行自动转换的方法。
Scala 然后用隐式概括了这个特性。自动转换不再存在,取而代之的是隐式转换——这只是 Function1
值,因此可以作为参数传递。从此,T <% Ordered[T]
意味着隐式转换的值将作为参数传递。由于强制转换是自动的,函数的调用者不需要显式传递参数——所以这些参数变成了隐式参数。
请注意,有两个概念——隐式转换和隐式参数——非常接近,但并不完全重叠。
无论如何, View 类型成为隐式传递隐式转换的语法糖。它们将被重写如下:
def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a
def max[T](a: T, b: T)(implicit $ev1: Function1[T, Ordered[T]]): T = if ($ev1(a) < b) b else a
Function1
.然后是它们的实际使用,然后是这些用途的语法糖。
def max[T](a: T, b: T)(implicit $ev1: Ordering[T]): T = if ($ev1.lt(a, b)) b else a
// latter followed by the syntactic sugar
def max[T: Ordering](a: T, b: T): T = if (implicitly[Ordering[T]].lt(a, b)) b else a
new Array[Int](size)
def f[T](size: Int) = new Array[T](size) // won't compile!
def f[T: ClassManifest](size: Int) = new Array[T](size)
Manifest // Provides reflection on a type
ClassManifest // Provides reflection on a type after erasure
Ordering // Total ordering of elements
Numeric // Basic arithmetic of elements
CanBuildFrom // Collection creation
max
,
sum
和
map
.一个广泛使用上下文边界的库是 Scalaz。
def withTransaction(f: Transaction => Unit) = {
val txn = new Transaction
try { f(txn); txn.commit() }
catch { case ex => txn.rollback(); throw ex }
}
withTransaction { txn =>
op1(data)(txn)
op2(data)(txn)
op3(data)(txn)
}
withTransaction { implicit txn =>
op1(data)
op2(data)
op3(data)
}
Option
上的此定义:
def flatten[B](implicit ev: A <:< Option[B]): Option[B]
scala> Option(Option(2)).flatten // compiles
res0: Option[Int] = Some(2)
scala> Option(2).flatten // does not compile!
<console>:8: error: Cannot prove that Int <:< Option[B].
Option(2).flatten // does not compile!
^
关于scala - Scala 中隐式参数的好例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530893/
我有一些 Scala 代码,它用两个不同版本的类型参数化函数做了一些漂亮的事情。我已经从我的应用程序中简化了很多,但最后我的代码充满了形式 w(f[Int],f[Double]) 的调用。哪里w()是
如果我在同一目录中有两个单独的未编译的 scala 文件: // hello.scala object hello { def world() = println("hello world") }
val schema = df.schema val x = df.flatMap(r => (0 until schema.length).map { idx => ((idx, r.g
环境: Play 2.3.0/Scala 2.11.1/IntelliJ 13.1 我使用 Typesafe Activator 1.2.1 用 Scala 2.11.1 创建一个新项目。项目创建好后
我只是想知道如何使用我自己的类扩展 Scala 控制台和“脚本”运行程序,以便我可以通过使用实际的 Scala 语言与其通信来实际使用我的代码?我应将 jar 放在哪里,以便无需临时配置即可从每个 S
我已经根据 README.md 文件安装了 ensime,但是,我在低级 ensime-server 缓冲区中出现以下错误: 信息: fatal error :scala.tools.nsc.Miss
我正在阅读《Scala 编程》一书。在书中,它说“一个函数文字被编译成一个类,当在运行时实例化时它是一个函数值”。并且它提到“函数值是对象,因此您可以根据需要将它们存储在变量中”。 所以我尝试检查函数
我有 hello world scala native 应用程序,想对此应用程序运行小型 scala 测试我使用通常的测试命令,但它抛出异常: NativeMain.scala object Nati
有few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建
我是 Scala 的新手。但是,我用 创建了一个中等大小的程序。斯卡拉 2.9.0 .现在我想使用一个仅适用于 的开源库斯卡拉 2.7.7 . 是吗可能 在我的 Scala 2.9.0 程序中使用这个
有没有办法在 Scala 2.11 中使用 scala-pickling? 我在 sonatype 存储库中尝试了唯一的 scala-pickling_2.11 工件,但它似乎不起作用。我收到消息:
这与命令行编译器选项无关。如何以编程方式获取代码内的 Scala 版本? 或者,Eclipse Scala 插件 v2 在哪里存储 scalac 的路径? 最佳答案 这无需访问 scala-compi
我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。 这是我的 Rational 类的初始版本(基于本书) class Rational(numerato
我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库内创建了一个mysql连接池。这是我的库的build.sbt organization := "com.learn" name :
我正在尝试运行一些 Scala 代码,只是暂时打印出“Hello”,但我希望在 SBT 项目中编译 Scala 代码之前运行 Scala 代码。我发现在 build.sbt 中有以下工作。 compi
Here链接到 maven Scala 插件使用。但没有提到它使用的究竟是什么 Scala 版本。我创建了具有以下配置的 Maven Scala 项目: org.scala-tools
我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结
我有一个 scala 宏,它依赖于通过包含其位置的静态字符串指定的任意 xml 文件。 def myMacro(path: String) = macro myMacroImpl def myMacr
这是我的功能: def sumOfSquaresOfOdd(in: Seq[Int]): Int = { in.filter(_%2==1).map(_*_).reduce(_+_) } 为什么我
这个问题在这里已经有了答案: Calculating the difference between two Java date instances (45 个答案) 关闭 5 年前。 所以我有一个这
我是一名优秀的程序员,十分优秀!