scala源码太灵活,有没有对应风格的scala教程

2020-05-19 09:08发布

1条回答
小冰块儿
2楼 · 2020-05-19 09:17

Scala提供了很多学习材料帮助你学习核心语言内容,有很多在线的教程、示例和项目可以去研究。但是Scala提供的最重要的一个工具是交互模式(REPL)。REPL是一个交互式解释器,可以即时编译、运行代码并返回结果。假定你已经在机器上装好了Scala,也设置了正确的路径,那么在命令行下运行scala命令就可以启动Scala REPL。启动Scala REPL后屏幕上会输出如下内容:

后面的代码示例中,我会用scala>提示这是输入到REPL的内容。接下来的一行是REPL的输出。我们在REPL里快速做几个例子,看看会得到什么输出。

你应该注意到了在我们输入解释器的每个语句后,它会输出一行信息,类似res0: java.lang.String = Hello。输出的第一部分是REPL给表达式起的变量名。在这几个例子里,REPL为每个表达式定义了一个新变量(res0到res3)。输出的第二部分(:后面的部分)是表达式的静态类型。第一个例子的类型是java.lang.String,最后一个例子的类型则是scala.util.matching.Regex。输出的最后一部分是表达式求值后的结果的字符串化显示。一般是对结果调用toString方法得到的输出,JVM给所有的类都定义了toString方法。

图2.1 REPL的返回值

如你所见,REPL是一种测试Scala语言及其类型系统的强有力手段。不仅如此,大部分构建工具都提供了机制让你能加载当前工程的classpath,然后启动REPL。这意味着你可以在REPL里访问工程中引用的库和你自己的代码。你能够在REPL里调用API和访问远端服务器。这是很棒的快速测试Web服务或REST API的方法,也导向我称为实验驱动开发(Experiment Driven Development)的方法。

2.1.1 实验驱动开发

实验驱动开发就是开发者在写测试或生产代码前,先花点时间在交互环境或REPL里做实验。这可以给你时间全面理解你需要打交道的软件或库的外部接口,并对其API的优点和缺点得到点切身体会。这是学习新发布的Web服务或RESTful API或最新的Apache库的极好办法,甚至可以用来学习你同事刚刚写出来的东西。在理解了API是怎么工作后,你就能更好地写自己的代码,或者开始写测试,如果你遵循测试驱动开发的话。

现在推动开发人员拥抱测试驱动开发(TDD)的呼声很高。TDD要求开发者先写单元测试,然后写实现类。在你开始写测试前,你并不总是很清楚自己的API要定义成什么样的。TDD的一个组成部分就是通过写测试来定义API,这样e799bee5baa6e79fa5e98193e59b9ee7ad9431333363393663你可以在(用户的)上下文里来看你的代码,可以感觉一下你自己愿意不愿意用你自己写的API。由于表达力(较差)的原因,强类型语言在应用TDD时可能会比动态语言碰到更多麻烦。实验驱动开发将“定义API”这个步骤向前期推动一步,提前到了写测试代码之前。REPL帮助开发者确保其设计的API在类型系统里能表达得出来。

Scala是一种语法非常灵活的强类型语言,因此有时候需要用点手段欺骗类型系统才能达成你真正想要的API设计。因为很多开发者缺乏强类型理论基础,所以经常需要更多的实验。实验驱动设计(Experiment Driven Design)让你在REPL里结合类型系统进行实验,以便为你的API提炼出最有效的类型定义。实验驱动设计主要用在给代码里添加大特性或领域对象的时候,不适合在添加新方法或者修bug时使用。

实验驱动设计在你定义领域特定语言时(DSL)也能帮上大忙。领域特定语言是用于特定领域的伪编程语言,这种语言专门用来解决手头的某个领域,比如说,从数据库里查询数据。DSL可以是内部的,在很多Scala库里都能看到的;也可以是外部的,比如SQL。在Scala社区,库开发者圈子里非常流行为自己的库创建一种DSL。比如Scala的actors库定义了一种线程安全的发送和接收消息的DSL。

用Scala定义DSL的挑战之一在于有效地利用类型系统。设计良好的类型安全的DSL不仅应该富有表达力、易读,而且应该能在编译期而不是运行期捕捉到很多编程错误。同时静态类型信息也可以极大地提高性能。REPL不仅能用来实验怎样表达一个特定领域,而且能帮助你确定你得表达式是否能编译。进行Scala开发时,有些人采用下面这种创造性的流程。

  • 在REPL里实验API设计。

  • 把能工作的API拷贝到项目文件。

  • 为API写单元测试。

  • 修改代码直到测试通过。

  • 有效地使用实验驱动开发能够极大地提高你的API的质量。也会帮你在推进过程中更适应Scala的语法。不过这种做法有个大问题,就是并非所有能用Scala表达的API都能在REPL里表达。这是因为REPL是积极(eagerly)解析输入,即时解释执行的。

    2.1.2 绕过积极(eaglerly)解析

    Scala REPL尝试尽可能快地解析输入。这个特点加上其他一些限制,意味着有些东西很难甚至是无法在REPL里表达的。其中一个难以表达的重要的功能是伴生对象和伴生类。

    伴生对象和伴生类是一组用完全一样的名字定义的对象和类。用文件编译的方式很容易实现,就像这样简单的声明对象和类:

    这些语句在REPL里也能执行,但是它们不会像真的伴生类那样起作用。为证明这一点,我们来做一些只有伴生对象能做,普通对象做不了的事:访问类的私有变量。

    为了解决这个问题,我们需要把这些对象嵌入解释器里某个能访问到的其他作用域里。我们现在来把它们放入某个作用域里,以便能同时解释/编译类和伴生对象。

    我们在这创建了一个holder对象。这给了我们一个可访问的作用域,也把REPL的编译推迟到holder对象关闭的时候。这样我们就可以在REPL里测试/定义伴生对象了。

    即使绕过了积极解析,也还有一些语言特性无法在REPL里重现。大多数这种问题都跟包、包对象、包可见性约束等问题有关。尤其是你无法像在源代码文件里一样有效地在REPL里创建包和包对象。这也意味着其他跟包有关的语言特性,特别是使用private关键字实现的可见性限制也无法在REPL里表达。包通常用来为你的代码设定命名空间,以便与你可能使用的其他类库分开。通常情况下你不需要在REPL里用到它,但是可能有些时候你需要把玩一些Scala的高级特性,比如包对象和隐式解析(implicit resolution),这时你可能会想做点实验驱动开发。但是这种场景下,你无法在REPL里去表达。

    请不要绝望。如我之前说过的,大部分构建工具可以让你启动一个针对你当前工程的Scala REPL。作为最后的手段,你可以在Scala文件里把玩那些高级概念,重编译然后重启REPL会话。

    另外还有个工具叫做JRebel,它可以动态地在运行中的JVM里重载类文件。JRebel团队非常慷慨地为Scala中的使用提供了免费许可。利用这工具结合某种形式的持续编译—大部分Scala构建工具都提供的这一特性—你可以在修改工程文件后立刻在REPL会话里得到修改后的行为。对于maven-scala-plugin。Simple Build Tool提供了CC任务来做持续编译。不管用哪种构建工具都必须和JRebel类加载器集成以便实现动态类重载。这个技巧有点过于细节,而且可能会变,所以如果需要帮助请参考你用的构建工具的文档或者JRebel网站。

    在尝试创建大而复杂的系统前,你可以先利用REPL来实验Scala代码,获得一些真实的感觉。软件开发中,在开发一个新特性前,对当前系统得到一个稍微深入一些的理解(而不只是草草看过)往往是很重要的。Scala REPL可以让你投入最少的时间达成对系统的理解,还可以提高你的开发技巧。本书全文穿插着很多REPL的例子,因为它是教学Scala的最好工具。我经常完全通过REPL运行示例,而不是采用Java开发时的标准做法,先写main方法或者单元测试。

    REPL也是开始学习面向表达式编程的极佳方法。


相关问题推荐

  • 什么是大数据时代?2021-01-13 21:23
    回答 100

    大数据(big data)一词越来越多地被提及,人们用它来描述和定义信息爆炸时代产生的海量数据,而这个海量数据的时代则被称为大数据时代。随着云时代的来临,大数据(Big data)也吸引了越来越多的关注。大数据(Big data)通常用来形容一个公司创造的大量非结...

  • 回答 84

    Java和大数据的关系:Java是计算机的一门编程语言;可以用来做很多工作,大数据开发属于其中一种;大数据属于互联网方向,就像现在建立在大数据基础上的AI方向一样,他两不是一个同类,但是属于包含和被包含的关系;Java可以用来做大数据工作,大数据开发或者...

  • 回答 52
    已采纳

    学完大数据可以从事很多工作,比如说:hadoop 研发工程师、大数据研发工程师、大数据分析工程师、数据库工程师、hadoop运维工程师、大数据运维工程师、java大数据工程师、spark工程师等等都是我们可以从事的工作岗位!不同的岗位,所具备的技术知识也是不一样...

  • 回答 29

    简言之,大数据是指大数据集,这些数据集经过计算分析可以用于揭示某个方面相关的模式和趋势。大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。大数据的特点:数据量大、数据种类多、 要求实时性强、数据所蕴藏的...

  • 回答 14

    tail -f的时候,发现一个奇怪的现象,首先 我在一个窗口中 tail -f test.txt 然后在另一个窗口中用vim编辑这个文件,增加了几行字符,并保存,这个时候发现第一个窗口中并没有变化,没有将最新的内容显示出来。tail -F,重复上面的实验过程, 发现这次有变化了...

  • 回答 18

    您好针对您的问题,做出以下回答,希望有所帮助!1、大数据行业还是有非常大的人才需求的,对于就业也有不同的岗位可选,比如大数据工程师,大数据运维,大数据架构师,大数据分析师等等,就业难就难在能否找到适合的工作,能否与你的能力和就业预期匹配。2、...

  • 回答 33

    大数据的定义。大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法通过人脑甚至主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。大数据是对大量、动态、能持续的数据,通过运用新系统、新工具、新...

  • 回答 17

    最小的基本单位是Byte应该没多少人不知道吧,下面先按顺序给出所有单位:Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB,按照进率1024(2的十次方)计算:1Byte = 8 Bit1 KB = 1,024 Bytes 1 MB = 1,024 KB = 1,048,576 Bytes 1 GB = 1,024 MB = 1,048,576...

  • 回答 5

    MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的版本:针对不同的用户,MySQL分为两种不同的版本:MySQL Community Server社区版本,免费,但是Mysql不提供...

  • mysql安装步骤mysql 2022-05-07 18:01
    回答 2

    mysql安装需要先使用yum安装mysql数据库的软件包 ;然后启动数据库服务并运行mysql_secure_installation去除安全隐患,最后登录数据库,便可完成安装

  • 回答 5

    1.查看所有数据库showdatabases;2.查看当前使用的数据库selectdatabase();3.查看数据库使用端口showvariableslike'port';4.查看数据库编码showvariableslike‘%char%’;character_set_client 为客户端编码方式; character_set_connection 为建立连接...

  • 回答 5

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(    `runoob_id` INT UNSIGNED AUTO_INCREMENT,    `runoob_title` VARCHAR(100) NOT NULL,    `runoob_author` VARCHAR(40) NOT NULL,    `submission_date` DATE,    PRI...

  • 回答 9

    学习多久,我觉得看你基础情况。1、如果原来什么语言也没有学过,也没有基础,那我觉得最基础的要先选择一种语言来学习,是VB,C..,pascal,看个人的喜好,一般情况下,选择C语言来学习。2、如果是有过语言的学习,我看应该一个星期差不多,因为语言的理念互通...

  • 回答 7

    添加语句 INSERT插入语句:INSERT INTO 表名 VALUES (‘xx’,‘xx’)不指定插入的列INSERT INTO table_name VALUES (值1, 值2,…)指定插入的列INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)查询插入语句: INSERT INTO 插入表 SELECT * FROM 查...

  • 回答 5

    看你什么岗位吧。如果是后端,只会CRUD。应该是可以找到实习的,不过公司应该不会太好。如果是数据库开发岗位,那这应该是不会找到的。

  • 回答 7

    查找数据列 SELECT column1, column2, … FROM table_name; SELECT column_name(s) FROM table_name 

没有解决我的问题,去提问