180125_scala笔记1

  • Post author:
  • Post category:其他


HelloWorld.scala[与对象名一致]

object HelloWorld[首字母大写,驼峰]

class MyFirstScalaClass[首字母大写,驼峰]

def myMethodName()[首字母小写,驼峰]

def main(args: Array[String])[入口函数,格式固定]

package com.runoob {//包中含有的类

class HelloWorld

}

import java.awt.Color//导入*.java文件,其实是开放了通信路径

import java.awt._ // 引入包内所有成员

def handler(evt: event.ActionEvent) { // java.awt.event.ActionEvent

…  // 因为引入了java.awt,可以省去前面的部分

}

import语句可以出现在任何地方,而不是只能在文件顶部。

import java.awt.{Color, Font}//可以导入多个*.java文件

import java.util.{HashMap => JavaHashMap}// 导入并重命名成员

import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了,名称 _, _是被隐藏的意思(学python的)

//默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._

”’

Byte–>Short–>Int–>Long–>Float–>Double

Char

String

Boolean

Unit  //用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。

Null //不懂,暂时很少见使用

Nothing //它是任何其他类型的子类型。

Any //是所有其他类的超类

AnyRef //是Scala里所有引用类(reference class)的基类

”’

Int:0xFFFFFFFF,0777L

Float:1e30f,3.14159f(以正则模式^.*?f$为特征)

scala> val pa=(40,”Foo”)//学python的元组

pa: (Int, String) = (40,Foo)

//Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。默认访问级别是 public

//private在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员,Java中允许外部类访问内部类的私有成员。

//Scala中protected成员只允许保护成员在定义了该成员的的类的子类中被访问。Java中用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可访问。

package p{

class Super{

protected def f() {println(“f”)}

}

class Sub extends Super{

f()

}

class Other{

(new Super).f() //错误,Other类未继承Super类,看不见Super中被protected的f()方法

}

}

//作用域保护,Scala中访问修饰符可以通过使用限定词强调。格式为:private[x]或protected[x],这里的x指代某个所属的包、类或单例对象。如果写成private[x],读作”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。

package bobsrocckets{

package navigation{//navigation包中定义了一堆东西

private[bobsrockets] class Navigator{//被私有的类Navigator仅对bobsrockets包中的类可见

protected[navigation] def useStarChart(){}//被保护的方法useStarChart()仅对navigation包中的类及Navigator类和其子类可见

class LegOfJourney{

private[Navigator] val distance = 100//被私有的常量distance仅对Navigator类可见

}

private[this] var speed = 200//被私有的常量distance仅对LegOfJourney类的对象来调用时可见

}

}

package launch{//launch包中定义了一堆东西

import navigation._//导入包内所有成员

object Vehicle{

private[launch] val guide = new Navigator//被私有的常量guide仅对包launch中的类可见

}

}

}

object Test {

def main(args: Array[String]) {

var a = 10;

var b = 20;

var c = 25;

var d = 25;

println(“a + b = ” + (a + b) );

println(“a – b = ” + (a – b) );

println(“a * b = ” + (a * b) );

println(“b / a = ” + (b / a) );

println(“b % a = ” + (b % a) );

println(“c % a = ” + (c % a) );

println(“a == b = ” + (a == b) );

println(“a != b = ” + (a != b) );

println(“a > b = ” + (a > b) );

println(“a < b = ” + (a < b) );

println(“b >= a = ” + (b >= a) );

println(“b <= a = ” + (b <= a) );

var a = true;

var b = false;

println(“a && b = ” + (a&&b) );

println(“a || b = ” + (a||b) );

println(“!(a && b) = ” + !(a && b) );

}

}

//位运算符用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算

object Test {

def main(args: Array[String]) {

var a = 60;           /* 60 = 0011 1100 */

var b = 13;           /* 13 = 0000 1101 */

var c = 0;

c = a & b;            /* 12 = 0000 1100 */

println(“a & b = ” + c );

c = a | b;            /* 61 = 0011 1101 */

println(“a | b = ” + c );

c = a ^ b;            /* 49 = 0011 0001 */

println(“a ^ b = ” + c );

c = ~a;               /* -61 = 1100 0011 */

println(“~a = ” + c );

c = a << 2;           /* 240 = 1111 0000 */

println(“a << 2 = ” + c );

c = a >> 2;           /* 15 = 1111 */

println(“a >> 2  = ” + c );

c = a >>> 2;          /* 15 = 0000 1111 */

println(“a >>> 2 = ” + c );

}

}

1


() []


左到右

2


! ~


右到左

3


* / %


左到右

4


+ –


左到右

5


>> >>> <<


左到右

6


> >= < <=


左到右

7


== !=


左到右

8


&


左到右

9


^


左到右

10


|


左到右

11


&&


左到右

12


||


左到右

13


= += -= *= /= %= >>= <<= &= ^= |=


右到左

14


,


左到右

object Test {

def main(args: Array[String]) {

var x = 30;

if( x == 10 ){

println(“X 的值为 10”);

}else if( x == 20 ){

println(“X 的值为 20”);

}else if( x == 30 ){

println(“X 的值为 30”);

}else{

println(“无法判断 X 的值”);

}

}

}

object Test {

def main(args: Array[String]) {

var x = 30;

var y = 10;

if( x == 30 ){

if( y == 10 ){

println(“X = 30 , Y = 10”);

}

}

}

}

Scala函数名可以有以下特殊字符:+, ++, ~, &,-, — , \, /, :

def functionName ([参数列表]) : [return type]//无body,为隐式函数

def functionName ([参数列表]) : [return type] = {

function body

return [expr]

}

object add{

def addInt( a:Int, b:Int ) : Int = {

var sum:Int = 0

sum = a + b

return sum

}

}

object Hello{

def printMe( ) : Unit = {//无return,返回值是Unit类型,值为()

println(“Hello, Scala!”)

}

}

functionName( 参数列表 )//普通函数

[instance.]functionName( 参数列表 )//对象调用方法

object Test {//类中方法调用方法

def main(args: Array[String]) {

println( “Returned Value : ” + addInt(5,7) );

}

def addInt( a:Int, b:Int ) : Int = {

var sum:Int = 0

sum = a + b

return sum

}

}

scala> var x=10

x: Int = 10

scala> val s=if(x>9) 1 else -1

s: Int = 1

scala> val s=if(x>9) “xx”  else “yy”

s: String = xx

scala> val s=if(x>9) “xx”  else -1//两类值类型不一致,scala解释器只好推断为父类型Any

s: Any = xx

scala> val y=if(x>1) “jj”//没设置false时的返回值,即值类型不一致,退化成Any类型

y: Any = ()

scala> val y=if(x>11) {print(“hh”)}//没设置false时的返回值,true时是Unit,即值类型一致,故false时返回Unit类型的()

y: Unit = ()

scala> var h=if(x>5){//花括号未成对,body没结束,这里像R语言

| print(“Hello,World”)

| } else -1

Hello,Worldh: AnyVal = ()//值返回类型Unit和Int不一致,故返回的Int退化为AnyVal类型

scala> val y=if(x>11){ “jj”}//String和Unit不一致,故返回的Unit退化为Any类型

y: Any = ()

scala> object add{//函数名中表明返回值类型是好习惯

|    def addInt( a:Int, b:Int ) : Int = {

|       var sum:Int = 0

|       sum = a + b

|       return sum

|    }

| }

defined object add

scala> add.addInt(10,20)

res2: Int = 30

scala> var y={}//不太理解,可能是{}属于执行语句的一种

y: Unit = ()

scala> var y={//a1,a2,a3首次出现需要声明,否则报”value找不到”错误

| a1=1

| a2=2

| a3=3

| }

<console>:11: error: not found: value a1

a1=1

^

<console>:12: error: not found: value a2

a2=2

^

<console>:13: error: not found: value a3

a3=3

^

scala> var y={//{}属于执行语句的一种,没在最后一句返回值,就属于执行语句了,返回Unit

| var a1=1

| var a2=2

| var a3=3

| }

y: Unit = ()

scala> var y={//如果是函数,return a3,如果是变量,直接a3

| var a1=1

| var a2=2

| var a3=3

| a3

| }

y: Int = 3

scala> println(“Hello %s, %d years old”, “Fred”, 42)//继承c,python的特点

(Hello %s, %d years old,Fred,42)

scala> val name=readLine(“your name”)//控制台输出,提示语句是”your name”,但是输的时候看不到

warning: there was one deprecation warning; re-run with -deprecation for details//不理解

your namename: String = ysjtyyyyyyyy

scala> name

res4: String = ysjtyyyyyyyy

scala> var n=10

n: Int = 10

scala> while(n<16){//n是循环外变量,被循环改变了

| println(n)

| n=n+1

| }

10

11

12

13

14

15

scala> while(n<22){

| println(n)

| n+=1

| }

16

17

18

19

20

21

scala> for(i<- 1 to 10)println(i)//<-相当于vb中=号,to是闭区间取整数

1

2

3

4

5

6

7

8

9

10

scala> for(i<- 0 until 10)println(i)//until是左闭右开取整数

0

1

2

3

4

5

6

7

8

9

scala> var sun=0

sun: Int = 0

scala> for(ch<-“abc”)sun +=ch//迭代的是字符串”abc”中的每个char,而在+号操作符作用下类型转换成Int数

scala> sun

res17: Int = 294

scala> for(i<- 1 to 3;j<- 1 to 3)print((10*i+i)+””)//双层循环

111111222222333333

scala> for(i<- 1 to 3;j<- 1 to 3 if i==j)println((10*i+i)+””)//for()括号最后一句可以加循环启动的条件判断

11

22

33

scala> for(i<- 1 to 3;temp=4-i;j<- temp to 3)println(i*j)//for()括号的双层循环中间可以加入多个临时变量

3

4

6

3

6

9

scala> def sayHello(name:String)={//不返回值的函数

| println(“Hi,”+name)

| }

sayHello: (name: String)Unit

scala> sayHello(“Tom”)

Hi,Tom

scala> def add(a:Int,b:Int):Int=a+b//返回值的需要在()后加:返回值类型

add: (a: Int, b: Int)Int

scala> add(1,2)

res26: Int = 3

scala> def fac(n:Int)={

| var r=1

| for(i<- 1 to 10)r=r*1

| r//最后的表达式是函数的返回值

| }

fac: (n: Int)Int

scala> fac(5)

res27: Int = 1

scala> def fac(n:Int):Int={if(n<=0)1 else n*fac(n-1)}//递归需要有出口

fac: (n: Int)Int

scala> fac(5)

res28: Int = 120

scala> def sayHi(name:String=”Everyone”){//参数的默认值,空参时发挥作用,学python

| println(“Hi,”+name)

| }

sayHi: (name: String)Unit

scala> sayHi(“Tom”)

Hi,Tom

scala> sayHi()

Hi,Everyone

scala> sayHi//定义函数时是有参的,调用时必须加(),建议无论定义时是空参还是有参,都加()号

<console>:13: error: missing arguments for method sayHi;

follow this method with `_’ if you want to treat it as a partially applied function

sayHi

^

scala> def sayHi(name:String*){//可变长参数,在类型后加*号,实际传入的是数组,所以可用for()迭代,学python

| for(e<- name)println(“Hi,”+e)

| }

sayHi: (name: String*)Unit

scala> sayHi(“Jenny”)

Hi,Jenny

scala> sayHi()

scala> sayHi(“Jenny”,”Tonny”,”Tom”)

Hi,Jenny

Hi,Tonny

Hi,Tom

scala> def sum(args:Int*)={//好例子

| var r=0

| for(arg<-args)r+=arg

| r

| }

sum: (args: Int*)Int

scala> val s=sum(1,2,3,4,5,6)

s: Int = 21

scala> val s1=sum(1 to 6:_*)//to不直接产生数组,需要解锁,在后面加:_*可以变成数组

s1: Int = 21



版权声明:本文为qq_38382397原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。