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")(

我整个周末都在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")(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

  • 如果我错了,请纠正我,但在本例中使用implicit将在找到字符串时插入一个字符串。。?我不知道为什么打印出来的是7行而不是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
    (如您的第二个示例)?我找不到一种方法使其在语法上起作用。