Scala对如何将语言功能实现为库功能做了大量工作.
是否有语言专门处理的类型列表?
在规范中还是作为实现细节?
这将包括,例如,优化远离元组的匹配.
那些与模式匹配,理解,try-catch块和其他语言结构相关的特殊约定呢?
字符串在某种程度上是特殊的编译器吗?我看到字符串增强只是一个库隐式转换,并且支持字符串连接Predef,但是这种语言特别容易吗?
同样,我看到有关<:<和classOf和的问题asInstanceOf,并且不清楚什么是神奇的内在.有没有办法通过编译器选项或查看字节代码来区分?
我想了解一下,如果某个功能是由Scala.JS和Scala-native等实现统一支持的,或者某个功能实际上可能证明是依赖于实现的,这取决于库的实现.
sjr*_*jrd 74
有许多类型是编译器"已知"的类型,并且在不同程度上是特殊的.您可以在scalac的Definitions.scala中找到完整的列表.
我们可以根据他们所承受的特殊程度对他们进行分类.
免责声明:我可能已经忘记了一些.
以下类型对Scala的类型系统至关重要.它们会影响类型检查本身的执行方式.所有这些类型都在规范中提到(或者至少,它们肯定应该是).
Any,AnyRef,AnyVal,Null,Nothing:五种类型的坐在Scala的类型系统的顶部和底部.scala.FunctionN,匿名函数(包括eta-expansion)给出的(规范)类型.即使在具有SAM处理匿名函数的2.12中,FunctionN在某些情况下仍然是特殊的(特别是在重载分辨率方面).scala.PartialFunction (对类型推断的工作方式有影响)UnitInt,Long,Float,Double,Char,Boolean,String,Symbol,java.lang.ClassChars,弱一致性(这两个子弹一起覆盖所有基本类型)Option 和元组(用于模式匹配和自动元组)java.lang.Throwablescala.Dynamicscala.Singletonscala.reflect.*,特别是ClassTag,TypeTag等scala.annotation.{,ClassFile,Static}Annotationscala.annotation.*(例如unchecked)scala.language.*scala.math.ScalaNumber (出于不明原因)以下类型对类型系统并不重要.它们对类型检查没有影响.但是,Scala语言确实具有许多构造,这些构造都是这些类型的表达式.
这些类型也将在说明书中提及.
scala.collection.Seq,Nil和WrappedArray,用于varargs参数.TupleN 类型 Product和Serializable(对于案例类)MatchError,由模式匹配结构生成scala.xml.*scala.DelayedInitList(编译器会对这些执行一些简单的优化,例如重写List()为Nil)这可能是你最关心的列表,因为你说你有兴趣知道在不同的后端有什么不同.以前的类别由编译器的早期(前端)阶段处理,因此由Scala/JVM,Scala.js和Scala Native共享.此类别通常以编译器后端而闻名,因此可能具有不同的处理方式.请注意,Scala.js和Scala Native都尝试在合理的程度上模仿Scala/JVM的语义.
语言规范本身可能没有提到这些类型,至少不是所有类型.
以下是后端同意的内容(据我所知,Scala Native):
Boolean,Char,Byte,Short,Int,Long,Float,Double,Unit.scala.Array.Cloneable(目前Scala Native不支持,请参阅#334)String和StringBuilder(主要用于字符串连接)Object,几乎所有的方法以下是他们不同意的地方:
java.lang.Integer)Serializablejava.rmi.Remote 和 java.rmi.RemoteExceptionscala.annotation.*(例如strictfp)中的一些注释java.lang.reflect.*,由Scala/JVM用于实现结构类型此外,虽然本身不是类型,但是一长串原始方法也由后端专门处理.
除了上述类型(可在所有平台上使用)之外,非JVM平台还添加了自己的特殊类型以实现互操作性.
js.Any:概念上是第三个子类型Any,除了AnyVal和AnyRef.它们具有JavaScript语义而不是Scala语义.String 和所有原始类型的盒装版本(重写 - 所谓的"被劫持" - 由编译器)js.ThisFunctionN:他们的apply方法与其他JavaScript类型的行为不同(第一个实际参数成为thisArgument被调用函数的方法)js.UndefOr和js.|(它们表现为JS类型,即使它们没有扩展js.Any)js.Object(new js.Object()特别为空JS对象文字{})js.JavaScriptException(中表现非常特殊throw和catch)js.WrappedArray (用于贬低varargs)js.ConstructorTag(相似ClassTag)js.native和所有注释js.annotation.*另外,还有十几种原始方法.
UByte,UShort,UInt和ULongPtr,指针类型FunctionPtrN,函数指针类型native.*scala.scalanative.runtime| 归档时间: |
|
| 查看次数: |
2459 次 |
| 最近记录: |