Scala 斯卡拉:含蓄背后的魔力
我整个周末都在Scala玩“隐式”游戏,但我仍然很难掌握整个概念。这个问题是根据我的想法提出的。我决定采取进一步措施:Scala 斯卡拉:含蓄背后的魔力,scala,Scala,我整个周末都在Scala玩“隐式”游戏,但我仍然很难掌握整个概念。这个问题是根据我的想法提出的。我决定采取进一步措施: def a(b: String)(implicit c: () => String = () => "") = { println(s"$b - up next is "+c());c();b } implicit def conv(s: => String) = () => s 这时事情开始变得有点古怪: scala> a("1")(
def a(b: String)(implicit c: () => String = () => "") = {
println(s"$b - up next is "+c());c();b
}
implicit def conv(s: => String) = () => s
这时事情开始变得有点古怪:
scala> a("1")(a("2")(a("3")))
3 - up next is
2 - up next is 3
3 - up next is
1 - up next is 2
3 - up next is
2 - up next is 3
3 - up next is
这里的基本思想是让每一行相互参照,如下所示:
1
2 from 1
3 from 2
4 from 3
您将调用
c
两次,而不是只调用一次:
def a(b: String)(implicit c: () => String = () => "") = {
println(s"$b - up next is " + c())
b
}
然后产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
即使先调用a(“1”)
,它也必须在生成任何输出之前调用传递的()=>字符串。因此,a(“3”)
是第一个产生输出的
您需要改变这一点,让a(“2”)
告诉a(“3”)
它正在从a(“2”)
调用:
然后像这样调用它:
a("1", a("2", a("3")))("nothing")
产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
回答你的三点:
不,您的隐式参数采用的是()=>字符串,而不是字符串
如上所述,您不需要在此处使用它
阅读-Xlog隐式转换
,-Xlog隐式转换
和-Xprint:all
选项
您将调用c
两次,而不是只调用一次:
def a(b: String)(implicit c: () => String = () => "") = {
println(s"$b - up next is " + c())
b
}
然后产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
即使先调用a(“1”)
,它也必须在生成任何输出之前调用传递的()=>字符串。因此,a(“3”)
是第一个产生输出的
您需要改变这一点,让a(“2”)
告诉a(“3”)
它正在从a(“2”)
调用:
然后像这样调用它:
a("1", a("2", a("3")))("nothing")
产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
回答你的三点:
不,您的隐式参数采用的是()=>字符串,而不是字符串
如上所述,您不需要在此处使用它
阅读-Xlog隐式转换
,-Xlog隐式转换
和-Xprint:all
选项
您将调用c
两次,而不是只调用一次:
def a(b: String)(implicit c: () => String = () => "") = {
println(s"$b - up next is " + c())
b
}
然后产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
即使先调用a(“1”)
,它也必须在生成任何输出之前调用传递的()=>字符串。因此,a(“3”)
是第一个产生输出的
您需要改变这一点,让a(“2”)
告诉a(“3”)
它正在从a(“2”)
调用:
然后像这样调用它:
a("1", a("2", a("3")))("nothing")
产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
回答你的三点:
不,您的隐式参数采用的是()=>字符串,而不是字符串
如上所述,您不需要在此处使用它
阅读-Xlog隐式转换
,-Xlog隐式转换
和-Xprint:all
选项
您将调用c
两次,而不是只调用一次:
def a(b: String)(implicit c: () => String = () => "") = {
println(s"$b - up next is " + c())
b
}
然后产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
即使先调用a(“1”)
,它也必须在生成任何输出之前调用传递的()=>字符串。因此,a(“3”)
是第一个产生输出的
您需要改变这一点,让a(“2”)
告诉a(“3”)
它正在从a(“2”)
调用:
然后像这样调用它:
a("1", a("2", a("3")))("nothing")
产生:
3 - up next is
2 - up next is 3
1 - up next is 2
1 from nothing
2 from 1
3 from 2
回答你的三点:
不,您的隐式参数采用的是()=>字符串,而不是字符串
如上所述,您不需要在此处使用它
阅读-Xlog隐式转换
,-Xlog隐式转换
和-Xprint:all
选项
好的,我刚注意到你调用它的方式。您是否有这样一个调用它的示例:a(“1”)(a(“2”)(a(“3”))
,并让它返回1;1人中的2人;3 from 2
(就像你的第二个例子)?我找不到一种方法使它在语法上工作。好的,我只是注意到你调用它的方式。您是否有这样一个调用它的示例:a(“1”)(a(“2”)(a(“3”))
,并让它返回1;1人中的2人;3 from 2
(就像你的第二个例子)?我找不到一种方法使它在语法上工作。好的,我只是注意到你调用它的方式。您是否有这样一个调用它的示例:a(“1”)(a(“2”)(a(“3”))
,并让它返回1;1人中的2人;3 from 2
(就像你的第二个例子)?我找不到一种方法使它在语法上工作。好的,我只是注意到你调用它的方式。您是否有这样一个调用它的示例:a(“1”)(a(“2”)(a(“3”))
,并让它返回1;1人中的2人;3 from 2
(如您的第二个示例)?我找不到一种方法使其在语法上起作用。