scala学习笔记(一)

文章转至点击进入原文章
最近刚碰到个好机会去用scala,所以从本章开始记录scala的学习笔记,更多是实验就形式来表述和记录。如需转载请附带文章地址

1、scala入门准备工作

学习环境我是这样搭建的

首先选择ubuntu linux 14.04

然后安装docker 安装docker教程点这里

安装好后docker后,下载scala环境镜像

sudo docker pull index.alauda.cn/ttch/scala

下载好后,然后执行如下命令

sudo docker run --rm    \
    -v 本地目录:/scala \
    -it index.alauda.cn/ttch/scala bash

可以看到进入了一个bash console下。然后尝试执行scala。这样就进入了控制台程序中。

2、scala学习之旅

scala文法结构参考如下地址点击

阅读了不少scala的书籍和文章,几乎没有一个系统结构性讲解scala的。所以这也是写本系列文章的目的

下面简单按照几个结构进行整理和学习:

  • scala语法结构
  • 函数式
  • 算子
  • 组合算子

争取能梳理一个系统的文章路径,提供快速学习scala(本身scala这个语言的学习曲线也十分陡峭)

2.1、 scala语法结构

下面我们从文法角度去逐个使用例子看scala的使用方式和方法。

2.1.1关键词

abstract    case        catch       class       def
do          else        extends     false       final
finally     for         forSome     if          implicit
import      lazy        macro       match       new
null        object      override    package     private
protected   return      sealed      super       this
throw       trait       try         true        type
val         var         while       with        yield
_    :    =    =>    <-    <:    <%     >:    #    @

以上是的关键词组成

2.1.2 变量和常量声明的文法结构

那么下面先通过scala的交互命令行来进行基本的实验和讲解。

首先先来实验基本的定义声明,那么看看她的文法是什么样的?

 Dcl               ::=  ‘val’ ValDcl
                      |  ‘var’ VarDcl
                      |  ‘def’ FunDcl
                      |  ‘type’ {nl} TypeDcl

定义声明分成4部分。

那么首先看下完成val定义文法


方法1:

plainid  ::=  upper idrest
            |  varid
            |  op
id       ::=  plainid
            |  ‘`’ stringLiteral ‘`’
ValDcl   ::=  ids ‘:’ Type
ids      ::=  id {‘,’ id}

方法2:

PatVarDef         ::=  ‘val’ PatDef
                   |  ‘var’ VarDef
PatDef            ::=  Pattern2 {‘,’ Pattern2} [‘:’ Type] ‘=’ Expr

Pattern2          ::=  varid [‘@’ Pattern3]
                  |  Pattern3
Pattern3          ::=  SimplePattern
                  |  SimplePattern { id [nl] SimplePattern }
SimplePattern     ::=  ‘_’
                    |  varid
                    |  Literal
                    |  StableId
                    |  StableId ‘(’ [Patterns ‘)’
                    |  StableId ‘(’ [Patterns ‘,’] [varid ‘@’] ‘_’ ‘*’ ‘)’
                    |  ‘(’ [Patterns] ‘)’
                    |  XmlPattern

两种定义常量的方法可以看出,一个是需要提供类型

val valname : type = ...

另一种是直接定义常量,通过推导的方式得到常量的类型和初始化值。

val valname = ...

�假设()为可以存在或者不存在,按照语言的结构可以按照这样的理解

val valname (: type) = 推导公式

下面列举一些patVarDef中 val的定义方式有以下几种:

1.1

val (abc, bcd) = ("123","123")

结果为:

abc: String = 123
bcd: String = 123

1.2

val abc = (2,3)

结果为:

x: (Int, Int) = (2,3)

1.3

val array@Array(_,test) = Array("hello","hello")

结果为

array: Array[String] = Array(hello, hello)
test: String = hello

那么在上面的文法中可以看到可以跟指定 Type

val array@Array(test1:Any,test:String) = Array("hello","hello")

结果为:

array: Array[String] = Array(hello, hello)
test1: Any = hello
test: String = hello

1.4

val array@_,array2@_ =( Array("hello","hello"),Array("test","test"))

上面是一个多常量初始化赋值的文法,结果如下:

array: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))
array2: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))

那么左边加上括号是有上面区别呢?

 val (array@_,array2@_) =( Array("hello","hello"),Array("test","test"))

结果如下:

array: Array[String] = Array(hello, hello)
array2: Array[String] = Array(test, test)

2.1.3 StableId

如果需要了解更多可以点击官方参考
那么上面文法多次提到了StableId,stableId的文法是有如下构成的。

 StableId          ::=  id
                  |  Path ‘.’ id
 id               ::=  plainid
             |  ‘`’ stringLiteral ‘`’
 plainid          ::=  upper idrest
             |  varid
             |  op
varid            ::=  lower idrest
upper            ::=  ‘A’ | … | ‘Z’ | ‘$’ | ‘_’  // and Unicode category Lu
lower            ::=  ‘a’ | … | ‘z’ // and Unicode category Ll
idrest           ::=  {letter | digit} [‘_’ op]

那么根据官方参考来看看如下模式如何使用

如下有3种模式:

SimplePattern     ::=  StableId
                    |  StableId ‘(’ [Patterns ‘)’
                    |  StableId ‘(’ [Patterns ‘,’] [varid ‘@’] ‘_’ ‘*’ ‘)’

根据上面文法树分支可以得到4种模式

  • Stable Identifier Patterns

      SimplePattern   ::=  StableId
    
  • Constructor Patterns

      SimplePattern   ::=   ‘(’ [Patterns ‘)’
    
  • Extractor Patterns

      SimplePattern   ::=   ‘(’ [Patterns ‘)’
    
  • Pattern Sequences

      SimplePattern ::= StableId ‘(’ [Patterns ‘,’] [varid ‘@’] ‘_’ ‘*’ ‘)’
    

下面一个个分析其中模式和代码方式,这里只从val和var的角度去看待,其他模式下的使用方式暂时不作实验记录。

2.1.4 Stable Identifier Patterns

假设有这样一个需求,需要声明一个常量a,常量A初始化为C,现在需要确定C变量是否和B变量值匹配,如果不一样则报错。

那么可以这样写
val B , C = "hello"

结果如下:

B: String = hello
C: String = hello

赋值代码如下:

val a@B = C

结果如下:

 a: String = hello

2.1.5 Constructor Patterns

例子1

val a@("hello",1) = ("hello",1)

结果如下 :

a: (String, Int) = (hello,1)

例子2

val a@("hello","string") = ("hello",1)

结果如下:

<console>:8: error: type mismatch;
found   : String("string")
required: Int
   val a@("hello","string") = ("hello",1)
                  ^

从上面可以看出,构建常量的匹配初始化校验方式。

2.1.6 Extractor Patterns

官方例子:

val x = (1, 2)
val y = x match {
  case Pair(i, s) => Pair(s + i, i * i)
}

2.1.7 Pattern Sequences

val a@Seq('h','e','l',test @ _*) = Seq('h','e','l','l','o')


a: Seq[Char] = List(h, e, l, l, o)
test: Seq[Char] = List(l, o)

今天实验就到这了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容