【问题标题】:What is the type that the Scala REPL prints?Scala REPL 打印的类型是什么?
【发布时间】:2011-04-20 20:54:09
【问题描述】:

当我在repl中创建一个小Map时,它告诉我它的类型是不可变的。Map

scala> Map(1->1, 2->2)                                    
res8: scala.collection.immutable.Map[Int,Int] = Map((1,1), (2,2))

这并不是全部的真相,就像本例一样

scala> Map(1->1, 2->2).getClass
res9: java.lang.Class[_] = class scala.collection.immutable.Map$Map2

Scala 如何决定打印什么作为表达式的类型?

【问题讨论】:

    标签: scala read-eval-print-loop


    【解决方案1】:

    简短的回答是,Scala REPL 打印结果的静态类型,从您的表达式 Map(1->1, 2->2) 推断,getClass 返回动态类型,它可以是静态类型的子类型。

    更长的答案是关于 Scala 的类型推理引擎的工作原理。您可能想阅读Scala Language Reference 中的相关部分。

    【讨论】:

    • 其中静态类型是表达式求值的结果类型,而动态类型是实现该类型的实际类?
    • 啊,旧的,快速而肮脏的答案,然后是编辑技巧,现在让我的问题看起来很愚蠢!
    • 在最简单的情况下,给出的静态类型与方法定义中的返回类型完全相同。否则(具有推断类型参数的方法、取决于隐式参数的返回类型等),您将不得不检查类型推断引擎的详细信息,因为事情可能会变得非常复杂。动态类型由正在执行的方法体中发生的事情给出(这里,相关方法是Map.apply())。
    • @Duncan 对编辑感到抱歉;看完我的回答后,我也认为需要澄清一下。
    • 没问题,只是逗我。我正在研究 Scala Koans 并试图获得推理启发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多