Scala的单例对象

Scala伴生对象与IntelliJ IDEA配置
本文介绍Scala中的伴生对象及其使用方法,通过生成随机素数的例子展示了伴生对象的功能。同时,文章还提供了IntelliJ IDEA中字体及快捷键设置的指南。
通常,一个类对应一个伴生对象,其方法就跟Java中的静态方法一样,举例:BigInt类的BigInt伴生对象有一个生成指定位数的随机素数的方法probablePrime,在REPL中运行下列代码:
object HelloWorld{
  def main(args:Array[String]){
    for( i<- 1 to 10){
      println(BigInt.probablePrime(10,scala.util.Random));
    }
  }
}
得到的结果如下:
523
977
839
911
977
593
599
809
809
883
Process finished with exit code 0
个人推测,可能是第一个参数,10指定的是二进制的位数,那么2^10=1024,也就是说,这个函数产生的最大的随机素数的上限是1024
 这里的Random是一个单例的随机数生成器对象,而该对象是在scala.util包中定义的。这是用单例对象比用类更好的为数不多的场景之一。

如何把 intelliJIDEA的字体设置大点

File-Setting-IDE Settings-Editor-Colors & Fonts-Font 
(改之前需要先Save As…一个Scheme)
字体大小也可以在这里改一下。

如何把 intelliJIDEA的快捷键设置成Eclipse的快捷键

我就是eclipse转过来的,intellij idea里面可以设置成eclipse的快捷键风格,可能有些不同,按需要自己配置就行了。设置快捷键,打开设置(CTRL+ALT+S)搜索keymap

此时不应有 \scala\bin\scala.bat)。

需要注意的是最好不要将scala安装到带有空格的路径,否则可能在运行“scala -version”命令的时候报“此时不应有 \scala\bin\scala.bat)。”的错误提示。


以下是整合了单例对象讲解的完整博客内容: # Scala实现手机号码类型识别:从C语言基础到实战 作为学过C语言的零基础学习者,我们来看看Scala中如何实现手机号码类型识别。本文会结合C语言基础,对比介绍Scala的数组、函数与单例对象语法,再完成功能实现。 ## 一、Scala数组基础(对比C语言) 在C语言中,数组是固定长度、同类型元素的集合,比如 `int arr[5];`。而Scala的数组: - **不可变特性**:默认创建后元素不可变(修改需重新赋值)。 - **定义方式**:通过 `Array` 类创建。 示例: ```scala // C语言数组定义 // int cArray[3] = {1, 2, 3}; // Scala数组定义 val scalaArray = Array(1, 2, 3) // 自动推断类型为Array[Int] ``` ## 二、Scala函数定义语法(对比C语言) C语言中,函数定义会声明返回值类型,如 `void func() { ... }` 表示无返回值。Scala函数语法更明确: - **`def` 关键字**:Scala用 `def` 定义函数。 - **返回类型声明**:Scala强制显式声明返回类型(少数递归场景除外)。无有意义返回值时,用 `Unit`(类似C语言的 `void`)。 - **函数定义结构**: ```scala def 函数名(参数: 参数类型): 返回类型 = { // 函数体 } ``` 例如: ```scala def identify(segment: String): Unit = { // 函数体逻辑,无实际返回值,用Unit } ``` ## 三、Scala单例对象(对比C语言全局函数) 在C语言中,全局函数可直接调用(如 `printf`)。Scala通过 **单例对象** 实现类似功能,但更强调封装性: - **`object` 关键字**:定义全局唯一的单例对象,无需实例化,直接通过名称访问成员。 - **程序入口**:Scala程序的入口 `main` 方法必须定义在单例对象中。 示例: ```scala object PhoneNumberIdentify { // 单例对象内的方法可直接调用 def identify(segment: String): Unit = { println("识别逻辑") } // 程序入口,Scala程序从main方法启动 def main(args: Array[String]): Unit = { identify("133") // 直接调用单例对象内的方法 } } ``` **与C语言的对比**: - C语言的全局函数可直接调用(如 `func()`),Scala通过单例对象的名称调用(如 `PhoneNumberIdentify.identify("133")`)。 - 若方法定义在单例对象内部(与 `main` 平级),可省略对象名直接调用(如示例中的 `identify("133")`)。 ## 四、手机号码类型识别实现 ### 1. 准备号段数组 ```scala val telecomSegments = Array("133", "153", "177") val mobileSegments = Array("134", "135", "136") val unicomSegments = Array("130", "131", "132") ``` ### 2. 定义识别函数(在单例对象内) ```scala def identify(segment: String): Unit = { if (telecomSegments.contains(segment)) { println("中国电信") } else if (mobileSegments.contains(segment)) { println("中国移动") } else if (unicomSegments.contains(segment)) { println("中国联通") } else { println("暂不支持") } } ``` ### 3. 主方法调用 ```scala def main(args: Array[String]): Unit = { identify("133") // 直接调用单例对象内的方法 } ``` ## 五、代码完整示例 ```scala object PhoneNumberIdentify { // 定义各运营商号段数组 val telecomSegments = Array("133", "153", "177") val mobileSegments = Array("134", "135", "136") val unicomSegments = Array("130", "131", "132") // 定义识别函数(与main平级) def identify(segment: String): Unit = { if (telecomSegments.contains(segment)) { println("这个号码是属于中国电信的") } else if (mobileSegments.contains(segment)) { println("这个号码是属于中国移动的") } else if (unicomSegments.contains(segment)) { println("这个号码是属于中国联通的") } else { println("暂不支持该号段识别") } } // 程序入口 def main(args: Array[String]): Unit = { identify("133") // 直接调用单例对象内的方法 } } ``` ## 六、总结 通过案例,我们掌握了Scala的数组、函数与单例对象语法: 1. **数组**:Scala默认不可变,通过 `Array` 类创建,与C语言数组逻辑一致。 2. **函数**:强制声明返回类型,`Unit` 对应C语言的 `void`。 3. **单例对象**:封装全局逻辑,替代C语言的全局函数,提升代码组织性。 Scala语法虽与C语言有差异,但核心逻辑相通,结合C语言基础理解更轻松!帮我整理成博客的格式
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值