【问题标题】:Scala - What does ' => SomeType' means? [duplicate]Scala - '=> SomeType' 是什么意思? [复制]
【发布时间】:2018-04-06 13:21:01
【问题描述】:

今天我想问一下=> SomeType是什么意思。我发现它在this article 中使用。它在“顺序组合器”部分。

感谢您的任何回答!

【问题讨论】:

    标签: scala


    【解决方案1】:

    表示可以运行的代码块。

    例如:

    scala> def doTwice(op: =>Unit) = {op; op}
    doTwice: (op: => Unit)Unit
    
    scala> doTwice({println("Hi")})
    Hi
    Hi
    

    在这种情况下,=>Unit{println("Hi")}

    这里的“SomeType”是 Unit,因为 println 不会产生值。如果它产生一个Int,它将是=>Int

    【讨论】:

    • 哦,我明白了。谢谢!这就是我讨厌scala的地方。谷歌搜索这样的东西太难了 :) 感谢上帝的好人和 stackoverflow :)
    • 很好的例子。这里,op 被称为按名称调用 参数(与按值 相对)。请注意,写doTwice(println("Hi")) 也同样有效。当你在 Scala 中调用一个函数时,语法不会指明你是通过 name 还是通过 value 传递参数。
    • @Arg SymbolHound 是你的朋友。
    【解决方案2】:

    它表示两件事。首先,由于前缀=>,表示参数将传递by name。则表示传递的参数类型必须为SomeType

    有些人将两者混为一谈,认为=> SomeType 本身就是一种类型——它不是。它是两件事的结合:参数评估策略和参数类型。

    所以,请按名称简要说明,以防维基百科链接不清楚,如果你有这个:

    def f[A](x: => A) = { x; x }
    f(some stuff)
    

    然后 Scala 会这样执行:

    { some stuff; some stuff }
    

    在按值调用时,发生的情况更像是这样:

    val x = some stuff
    { x; x }
    

    还要注意,参数总是在调用时按值评估,但只评估一次。在按名称调用时,参数可能从不被评估(例如,如果它位于if 的非执行分支上),但可能会被评估多次。

    【讨论】:

    • 在这种情况下 [A] 代表什么?我在很多地方都看到过,但还是不明白
    • @elimence 这是一个类型参数。它是一种在声明f 时未知的类型,但在使用f 时将是已知的。函数f 对所有类型A 都有效,并且在这种情况下,A 可以是什么没有任何限制。我可以使用A <: SomeConcreteType 来指示下边界(A 必须是SomeConcreteType 或其子类型),A >: SomeOtherTypeA 必须是SomeOtherType 的超类),以及指示@ 987654340@ 必须是某个隐式参数的一部分,这会导致对 A 的任意限制。
    • 谢谢丹尼尔,现在知道了
    【解决方案3】:

    它只是一种不带参数的函数值。 Owen 的例子很酷,只要知道“A => B”是一个函数,其参数类型为 A,返回值类型为 B,而“=> B”是一个函数不带参数,返回类型为 B 的值。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2017-04-05
      • 2012-02-07
      • 2016-10-25
      • 2021-11-07
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多