学习Scala第一篇-从hello World开始

最近开始系统性的学习scala。其实之前使用过scala的,比如我在用Gatling这款性能测试工具的时候就接触到了scala了。Gatling本身就是用Scala写的,而且Gatling的性能测试配置文件本身就是一个scala类,可以随意使用scala甚至是Java提供的各种类库。当时觉得用Gatling特别舒服的原因就在于配置文件强大的表现力。而这种表现力就是由Scala语言提供的。

言归正传,学习Scala还是从最简单的Hello world开始。在Scala官网中显著的标题就是:

Object-Oriented Meets Functional

Have the best of both worlds. Construct elegant class hierarchies for maximum code reuse and extensibility, implement their behavior using higher-order functions. Or anything in-between.

从中可以看出Scala结合了面向对象及函数式编程这两种编程范式。在本文中我将会拿Java语言和其比较,看看到底Scala强在那里。

使用Java语言实现一个Hello World的代码如下:

1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

以下是Scala的实现:

1
2
3
4
5
object HelloWorld  {
  def main(args: Array[String]): Unit = {
    println("Hello, World!")
  }
}

好吧,如果标点符号不算代码行,Java版本和Scala版本的实现的代码行数是一致的。貌似Scala并没有减少什么。唯一减少的就在于println不用指定类名,以及对main方法不用声明为static。

在这里对Scala实现与Java实现的几个不同之处做个介绍。

  • 第一是Scala对HelloWorld的修饰符使用的是object。其实Scala中也有class关键字,那么object关键字和class关键字有什么区别那?简单来说object关键字定义了一个匿名类,并且创建了该匿名类的单个实例(采用单例模式),该实例名为HelloWorld。所以object中定义的方法自动都是static的。我觉得object关键字存在的价值之一就是建立起了面向对象和函数式的桥梁。因为在面向对象的系统中,所有方法都必须存在于类中,而函数式编程中没有类的概念,使用函数无需new类的实例,所以object中的方法都是静态方法,可以直接被调用。进一步解读请到这里
  • 第二是Scala中对变量的类型的定义方式是变量名在前,类型在后,中间用冒号相隔。原因之一是代码更可读。因为我们更关心变量名,而类型其次,尤其是你拥有一个超级长的类型的情况下(比如
    HashMap<Shape, Pair<String, String>>);原因之二据说是这样的方式在实现Scala类型时技术上要简单些。进一步解读请到这里
  • 第三是main函数的返回值是Unit,而不是Java中的Void。为什么是这样那?我想是因为Scala为了实现自己的类型系统,对于无显式返回值的函数直接使用Void是不合适的。在Scala.Unit文档中是这样定义Unit的:
Unit is a subtype of scala.AnyVal. There is only one value of type Unit, (), and it is not represented by any object in the underlying runtime system. A method with return type Unit is analogous to a Java method which is declared void.

  • 第四是Scala中表达式最后的分号是可选的。原因就是为了契合函数式编程的哲学,即一切尽可能的简单。不写分号程序员一天可以多敲一些代码出来。

好吧,其实在Scala中Hello World还有一种写法。

1
2
3
object HelloWordV2 extends App {
  println("Hello, World!")
}

代码从三行减少到了两行,Scala终于胜出了。那么App是个什么鬼?App是一个trait。trait又是什么鬼?trait是Scala中的一个特殊类型,它与Java中的interface很相似,但比interface强大。HelloWordV2添加了对App的扩展后,就自动成为了一个可以运行的程序,由于App中定义了main方法,所以HelloWorldV2中就无需再定义了,牛逼的地方在于HelloWorldV2的body中的代码都会作为main方法中的代码被执行。以下是App源码中对main方法的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@deprecatedOverriding("main should not be overridden", "2.11.0")
def main(args: Array[String]) = {

this._args = args

for (proc <- initCode) proc()

if (util.Properties.propIsSet("scala.time")) {

val total = currentTime - executionStart

Console.println("[total " + total + "ms]")

}

看来App在实现main方法时还设置了一个计时器,通过scala.time这个属性来开关。所以没事翻翻源码还是挺好玩的。

不知有没注意到其实main方法是有个叫args的参数的,那么新版HelloWorld中如何使用该参数那?直接使用它就行。

1
2
3
object HelloWordV2 extends App {
  println("Hello, World!" + args(0))
}

ok,Scala版的Hello World就到这里吧。

时间: 2024-10-04 02:42:24

学习Scala第一篇-从hello World开始的相关文章

Linux学习笔记——第一篇——Ubuntu安装与操作

笔者是Windows的使用者,由于Coding的需要以及在Linux下开发的方便,所以开始使用Linux. 当然笔者还是割舍不下Windows的,毕竟很多通讯工具等软件以及游戏在Linux下是没有发行的,所以笔者使用了虚拟机啊. 下面给出简单的安装过程. 1.下载虚拟机软件,笔者比较喜欢VMPlayer,因为它比较轻便且免费,并且很好的支持了拖拽复制功能(VM TOOL),当然也可以使用如VirtualBox.VPC等 链接:https://my.vmware.com/web/vmware/fr

PHP学习记录第一篇:Ubuntu14.04下LAMP的安装

最近一段时间会学习一下PHP全栈开发,将会写一系列的文章来总结学习的过程,以自勉. 第一篇记录一下LAMP环境的安装 0. 安装Apache Web服务器 安装之前先更新一下系统 sudo apt-get update && sudo apt-get dist-upgrade 然后安装Apache sudo apt-get install apache2 这时在浏览器里输入localhost就可以看到 "It works!", 说明安装成功. 1. 安装MySQL数据库

我们一起学习WCF 第一篇初识WCF(附源码供对照学习)

前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wcf所遇到的困难以及解决方案一点点记下来,可能还有很多不足之处那我们一起共同学习.在学习之前我们有必要初步的看下百度百科对wcf的解释,让我们心中有这一个概念,然后建立项目,然后再次看概念,然后在去更深层的建立项目,然后再去理解这样反复的去做我相信可以做好wcf.那么下面我就会从初识wcf,wcf消息

学习KnockOut第一篇之Hello World

笔者刚开始学习KnockOut.写的内容就相当于一个学习笔记.且在此处向官网致敬,比较喜欢他们家的Live Example版块,里面有jsFiddle.至于文档,辅导章节,也是有的.附上地址:KnockOut.感兴趣的话可以看一下的. 那么,开始. 先写一个连Hello World级别都算不上的.看了文档,貌似很简单的样子. 第一步引进ko的js脚本.第二步创建一个ViewModel.第三步创建一个简单的View,用data-bind绑定. 一个非常简单的text绑定. 1 <!DOCTYPE

Egret入门学习日记 --- 第一篇

第一篇(了解篇): 我人比较笨,得慢慢学,我就一点一点来好了. 首先,我个人喜欢游戏.网页开发相对游戏开发来说,网页开发实在太枯燥了,没劲.所以打算转游戏开发了. 游戏开发要选择游戏引擎,我去看了一些博客: 1.看的第一篇(发布于:2017年06月01日 22:20:16) https://blog.csdn.net/sujun10/article/details/72824248 说实话我被他的书写方式逗笑了,哈哈,真香.大佬最终还是选择了Egret. 2.看的第二篇(发布于:2018年04月

cocos2d-x学习记录第一篇-环境变量配置

最近准备学习cocos2d-x,之前一直是做iOS开发的,算是零基础开始学习吧. 本人用Mac电脑,不多说了,直接开始 第一步:下载需要的文件 1.下载cocos2dx http://www.cocos2d-x.org/download 2.下载android的sdk以及ndk http://developer.android.com/sdk/index.html 注释: 1)ndk可以直接下载,http://developer.android.com/tools/sdk/ndk/index.h

深度学习-机器学习 第一篇

简介 前置声明:本专栏的所有文章皆为本人学习时所做笔记而整理成篇,转载需授权且需注明文章来源,禁止商业用途,仅供学习交流.(欢迎大家提供宝贵的意见,共同进步) 正文: 机器学习,顾名思义,就是研究计算机如何学习和模拟人类的行为,并根据已学得的知识对该行为进行增强和改进. 举例来说,假设邮箱收到了一封新邮件,通常我们可以通过邮件里是否含有广告.不相关信息以及乱码等特征,人为的来判断这封邮件是否是一封垃圾邮件. 如上述可知,机器学习模拟人类的行为,所以它同样依据这些邮件内容的特征来判断一封邮件是否是

Vue学习【第一篇】:Vue初识与指令

什么是Vue 什么是Vue Vue.js是一个渐进式JavaScript框架它是构建用户界面的JavaScript框架(让它自动生成js,css,html等) 渐进式:vue从小到控制页面中的一个变量到页面一块内容到整个页面,最终大到整个项目,东可以用vue框架来实现 vue可以干哪些事 将数据渲染到指定区域(数据可以是后台获取,也可以由前台自己产生) 可以与页面完成基于数据的交互方式 为什么学习Vue 1.整合了Angular React框架的优点(第一手API文档是中文的) 2.单页面应用(

Python学习(第一篇)

说明:笔者所用的版本是python3.6 首先,说一下python的三种格式输出.第一种用到了格式化操作符%,格式化字符串时,Python使用一个字符串作为模板.模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式. Python用一个tuple(元组)将多个值传递给模板,每个值对应一个格式符. 第二种用到了format方法,请仔细阅读代码. 1 # Author:yang 2 name=input("name:") 3 age=input("age:&q