如何学习scala?这是我总结的一些经验,在此记录以便复习。
(1)官网 https://www.scala-lang.org/ 从官网上几乎可以了解到关于scala的大部分信息
学习SBT是学习Scala必备技能,因为全世界90%以上的人使用SBT构建Scala项目= =,基础不牢,地动山摇,懂吧。
https://www.scala-sbt.org/index.html 大部分人构建scala项目使用的工具
SBT的操作手册,学习SBT就靠它 https://www.scala-sbt.org/1.x/docs/index.html
SBT的API文档 https://www.scala-sbt.org/1.4.0/api/sbt/index.html
这里可能会无法下载,解决方法是在这个网站手动下载rpm包 https://sbt.bintray.com/rpm/ 然后上传到集群,再使用rpm -ivh命令安装
这里篇幅很长,而且是从官网翻译而来,并且运行测试后截图记录了。
mkdir foo-build cd foo-build touch build.sbt在当前项目根目录下,输入sbt命令即可进入sbt的shell
sbt第一次运行需要下载大量的依赖,可能会下载很久,建议开加速器下载,会更快。
在complie前加~,每次你改动资源文件都会自动编译
在刚才热加载的基础上,不要关闭那个有热加载的shell窗口,而是新打开一个shell窗口, 在项目目录下创建以下资源文件夹:
src/main/scala/example再创建hello.scala文件,输入以下内容
package example object Hello extends App { println("Hello") }然后在热加载的窗口可以看到以下内容:
set ThisBuild / scalaVersion := “2.12.12” 查看设置的scalaVersion:
然后build.sbt会包含你设置的scalaVersion
编辑build.sbt,输入以下内容,保存
ThisBuild / scalaVersion := "2.12.12" ThisBuild / organization := "com.example" lazy val hello = (project in file(".")) .settings( name := "Hello" )重新加载你修改的build.sbt 在shell窗口里输入reload 要注意,命令最左边的行号变成了sbt:Hello,这说明reload生效了。
添加ScalaTest到libraryDependencies里 修改build.sbt,修改完记得在shell里reload一下
ThisBuild / scalaVersion := "2.12.12" ThisBuild / organization := "com.example" lazy val hello = (project in file(".")) .settings( name := "Hello", libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test, )reload之后你就可以在shell里运行test命令了,第一次运行test命令会下载一堆东西。
还有一个命令是不间断的运行增量测试(就是热加载,一旦新写出了一个测试方法,就立刻执行)。
~testQuick要测试之前你得先写个测试方法。 创建一个文件:src/test/scala/HelloSpec.scala 输入以下内容:
import org.scalatest._ class HelloSpec extends FunSuite with DiagrammedAssertions { test("Hello should start with H") { assert("hello".startsWith("H")) } }可以看到,因为hello的h不是大写的H所以返回了false,然后测试失败了,但是其实测试成功了,只不过返回的是失败信息。
也就是测试不通过,但是测试本身是运行成功的。 那怎么让测试通过?只需要把hello的h改为H即可。 如下,修改后,测试通过
添加依赖修改build.sbt为如下内容:
ThisBuild / scalaVersion := "2.12.12" ThisBuild / organization := "com.example" lazy val hello = (project in file(".")) .settings( name := "Hello", libraryDependencies += "com.typesafe.play" %% "play-json" % "2.6.9", libraryDependencies += "com.eed3si9n" %% "gigahorse-okhttp" % "0.3.1", libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test, )修改完毕后reload一下即可
使用Scala REPL我们可以查找到纽约最近的天气
sbt:Hello> console [info] Starting scala interpreter... Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171). Type in expressions for evaluation. Or try :help. scala> :paste // Entering paste mode (ctrl-D to finish) import scala.concurrent._, duration._ import gigahorse._, support.okhttp.Gigahorse import play.api.libs.json._ Gigahorse.withHttp(Gigahorse.config) { http => val baseUrl = "https://www.metaweather.com/api/location" val rLoc = Gigahorse.url(baseUrl + "/search/").get. addQueryString("query" -> "New York") val fLoc = http.run(rLoc, Gigahorse.asString) val loc = Await.result(fLoc, 10.seconds) val woeid = (Json.parse(loc) \ 0 \ "woeid").get val rWeather = Gigahorse.url(baseUrl + s"/$woeid/").get val fWeather = http.run(rWeather, Gigahorse.asString) val weather = Await.result(fWeather, 10.seconds) ({Json.parse(_: String)} andThen Json.prettyPrint)(weather) } // press Ctrl+D // Exiting paste mode, now interpreting. import scala.concurrent._ import duration._ import gigahorse._ import support.okhttp.Gigahorse import play.api.libs.json._ res0: String = { "consolidated_weather" : [ { "id" : 6446939314847744, "weather_state_name" : "Light Rain", "weather_state_abbr" : "lr", "wind_direction_compass" : "WNW", "created" : "2019-02-21T04:39:47.747805Z", "applicable_date" : "2019-02-21", "min_temp" : 0.48000000000000004, "max_temp" : 7.84, "the_temp" : 2.1700000000000004, "wind_speed" : 5.996333145703094, "wind_direction" : 293.12257757287307, "air_pressure" : 1033.115, "humidity" : 77, "visibility" : 14.890539250775472, "predictability" : 75 }, { "id" : 5806299509948416, "weather_state_name" : "Heavy Cloud", ... scala> :q // to quit运行console时需要下载
https://stackoverflow.com/
在学习过程中遇到的问题,可以在这里提问,查找相关答案,解决方法等等。 百度,谷歌也能找到答案,但是StackOverflow可是全球最大的bug解决基地,精英都在这儿了。
本文持续更新中…