Oop Scala类、对象、大小写类、文本

Oop Scala类、对象、大小写类、文本,oop,scala,smalltalk,Oop,Scala,Smalltalk,我只是想了解一下Scala的基本概念。因此,每次用关键字“new”实例化一个类时,我们都会得到一个新对象。不能使用关键字“new”实例化使用object关键字声明的单例对象,因为只能有一个。在某种意义上,它是在编译时实例化的 4是Int的case类吗?5.07是双倍的案例级吗 4是物体吗 类本身有时是对象,还是始终是对象 函数是对象。它们也是类的实例?这是如何结合在一起的 Scala是像Smalltalk一样纯粹面向对象,还是在面向对象方面做了一些妥协 4和5.07不是对象。它们只是和类的实例。

我只是想了解一下Scala的基本概念。因此,每次用关键字“new”实例化一个类时,我们都会得到一个新对象。不能使用关键字“new”实例化使用object关键字声明的单例对象,因为只能有一个。在某种意义上,它是在编译时实例化的

4是Int的case类吗?5.07是双倍的案例级吗

4是物体吗

类本身有时是对象,还是始终是对象

函数是对象。它们也是类的实例?这是如何结合在一起的


Scala是像Smalltalk一样纯粹面向对象,还是在面向对象方面做了一些妥协

4和5.07不是对象。它们只是和类的实例。看看层次结构

对象在编译时未实例化。当您第一次访问它时,它被实例化(在对象体/构造函数执行的意义上)

函数也不是对象,它们是扩展FunctionN(例如)的匿名类的实例。但是,是的,它提供了一些常见的实用工具,允许您编写:

//instance of Function2
scala> val sum = (x: Int, y: Int) => x+y
sum: (Int, Int) => Int = <function2>

scala> sum.curried
res0: Int => (Int => Int) = <function1>

// now back to uncurried version with Function object
scala> Function.uncurried(res0)
res1: (Int, Int) => Int = <function2>
//函数2的实例
scala>valsum=(x:Int,y:Int)=>x+y
总和:(Int,Int)=>Int=
scala>sum.curried
res0:Int=>(Int=>Int)=
//现在回到函数对象的未传送版本
scala>函数未载波(res0)
res1:(Int,Int)=>Int=
若你们对普通类和case类的区别感兴趣,那个么看看


不幸的是,与smalltalk one相比,我不知道smalltalk可以对scala oop的纯度进行假设。

4和5.07不是对象。它们只是和类的实例。看看层次结构

对象在编译时未实例化。当您第一次访问它时,它被实例化(在对象体/构造函数执行的意义上)

函数也不是对象,它们是扩展FunctionN(例如)的匿名类的实例。但是,是的,它提供了一些常见的实用工具,允许您编写:

//instance of Function2
scala> val sum = (x: Int, y: Int) => x+y
sum: (Int, Int) => Int = <function2>

scala> sum.curried
res0: Int => (Int => Int) = <function1>

// now back to uncurried version with Function object
scala> Function.uncurried(res0)
res1: (Int, Int) => Int = <function2>
//函数2的实例
scala>valsum=(x:Int,y:Int)=>x+y
总和:(Int,Int)=>Int=
scala>sum.curried
res0:Int=>(Int=>Int)=
//现在回到函数对象的未传送版本
scala>函数未载波(res0)
res1:(Int,Int)=>Int=
若你们对普通类和case类的区别感兴趣,那个么看看


不幸的是,与smalltalk相比,我不知道smalltalk如何对scala oop纯度做出假设。

当您使用
new
操作符实例化一个类时,您会得到该类的一个新实例。新实例是一个对象

可以使用
对象
关键字声明单例对象。说它是在编译时实例化的,实际上并不意味着什么。对象仅在程序运行时存在,而不是在此之前(例如编译程序时)。
对象在第一次使用时被实例化

4是Int的case类吗?5.07是双倍的案例级吗

No.4和5.07只是类
Int
Double
的实例。在Scala中,它们的行为方式与对象相同,但幕后4和5.07并不是真正的对象。要理解这一点,您必须了解标准的Scala类层次结构

层次结构的顶部是类型
Any
。一切都扩展了
任何
Any
有两个直接子类型:
AnyVal
AnyRef

  • AnyVal
    是所有值类型的超类型。值类型是映射到JVM基本类型的类型(例如:
    Int
    ->
    Int
    Double
    ->
    Double
    等)
  • AnyRef
    是所有引用类型(“常规”对象)的超类型
在运行时,扩展
AnyRef
的所有内容都是幕后的对象,而扩展
AnyVal
的所有内容都不是真正的对象;它映射到一个基元类型


Case类只是一种语法糖。case类与普通类完全相同,只是编译器会自动为您添加一些方法(例如,这使它们适合于模式匹配)。

当您使用
new
操作符实例化一个类时,您会得到该类的一个新实例。新实例是一个对象

可以使用
对象
关键字声明单例对象。说它是在编译时实例化的,实际上并不意味着什么。对象仅在程序运行时存在,而不是在此之前(例如编译程序时)。
对象在第一次使用时被实例化

4是Int的case类吗?5.07是双倍的案例级吗

No.4和5.07只是类
Int
Double
的实例。在Scala中,它们的行为方式与对象相同,但幕后4和5.07并不是真正的对象。要理解这一点,您必须了解标准的Scala类层次结构

层次结构的顶部是类型
Any
。一切都扩展了
任何
Any
有两个直接子类型:
AnyVal
AnyRef

  • AnyVal
    是所有值类型的超类型。值类型是映射到JVM基本类型的类型(例如:
    Int
    ->
    Int
    Double
    ->
    Double
    等)
  • AnyRef
    是所有引用类型(“常规”对象)的超类型
在运行时,扩展
AnyRef
的所有内容都是幕后的对象,而扩展
AnyVal
的所有内容都不是真正的对象;它映射到一个基元类型

Case类只是一种语法糖。case类与普通类完全相同,只是编译器添加了