我正在学习scala implicits。 在下面的示例代码中,不会自动调用隐式应用:
package learn
object ImplicitApplyInClass {
def main(args: Array[String]): Unit = {
implicit val ss = "abc"
//This is working
val a = A(1).apply.toUpperCase
//This is giving compile time error
//val b = A(1).toUpperCase
}
}
case class A(id: Int) {
implicit def apply(implicit s: String) = {
s.toUpperCase
}
}
请建议当thr范围内的隐含参数可用时,为什么不会隐式调用apply?
答案 0 :(得分:2)
您可以添加空参数列表,这将起作用:
Main()
{
setMouseCallback("WinName", onMouse, 0);
setMouseCallback("WinName", DrawLine, 0);
// capture first frame of video
cap >> frame;
// set midpoint when onMouse is called
// set coordinates of the line when DrawLine is called
while (true)
{
cap >> frame;
// do the rest of your stuff here
}
}
此处 case class A(id: Int) {
implicit def apply()(implicit s: String) = {
s.toUpperCase
}
}
val b = A(1)().toUpperCase
println(b) // ABC
不能作为隐式转化。
从类型
apply
到类型S
的隐式转换由隐式定义 具有函数类型T
的值,或者通过隐式方法 可转换为该类型的值。隐式转换适用于两种情况:
•如果表达式
S => T
的类型为e
,且S
不符合表达式的预期类型S
。•如果选择器
T
未表示e.m
的成员,则选择e
S
类型为m
的选项。在第一种情况下,搜索适用的转化
S
到c
,其结果类型符合e
。在第二种情况下,a 搜索适用于T
及其结果的转化c
包含名为e
的成员。
来自here。
在您的代码中,没有任何一种情况。
案例1不适用,因为m
是apply
。案例2不适用,因为没有隐式转换String => String
。
答案 1 :(得分:0)
你可以试试这个:
object ImplicitApplyInClass {
def main(args: Array[String]): Unit = {
implicit val ss = "abc"
val b = A(1).toUpperCase
println(b)
}
}
object A {
implicit def f(a: A)(implicit s: String): String = s
}
case class A(id: Int)
答案 2 :(得分:0)
在class A
中定义隐式方法时,这与定义此类的隐式转换完全不同。
它可以作为定义范围内的隐式使用,但它是从String
到String
的隐式转换,编译器没有任何理由可以隐式使用。