Scala Language스칼라 언어 시작하기

비고

스칼라 (Scala)는 간결하고 우아하며 유형 안전성이 높은 방식으로 일반적인 프로그래밍 패턴을 표현하도록 설계된 최신 멀티 패러다임 프로그래밍 언어입니다. 객체 지향기능 언어의 기능을 원활하게 통합합니다.

대부분의 예제는 작동중인 스칼라 설치가 필요합니다. 이것은 스칼라 설치 페이지 이며 이것은 ' 스칼라 설치 방법' 예제입니다. scalafiddle.net 은 웹을 통해 작은 코드 예제를 실행하기에 좋은 리소스입니다.

버전

번역 출시일
2.10.1 2013-03-13
2.10.2 2013-06-06
2.10.3 2013-10-01
2.10.4 2014-03-24
2.10.5 2015-03-05
2.10.6 2015-09-18
2.11.0 2014-04-21
2.11.1 2014-05-21
2.11.2 2014-07-24
2.11.4 2014-10-30
2.11.5 2014-01-14
2.11.6 2015-03-05
2.11.7 2015-06-23
2.11.8 2016-03-08
2.11.11 2017-04-19
2.12.0 2016-11-03
2.12.1 2016-12-06
2.12.2 2017-04-19

'기본'방법 정의로 Hello World

이 코드를 HelloWorld.scala 라는 파일에 HelloWorld.scala .

object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
  }
}

라이브 데모

JVM에 의해 실행 가능한 바이트 코드로 컴파일하기 :

$ scalac HelloWorld.scala

그것을 실행하려면 :

$ scala Hello

스칼라 런타임은 프로그램을로드 할 때 main 메소드가있는 Hello 라는 객체를 찾습니다. main 방법은 프로그램 엔트리 포인트이며 실행됩니다.

자바와는 달리, 스칼라 그들이에있어 파일 후 개체 또는 클래스를 명명의 어떤 요구 사항이 없습니다, 않습니다. 대신, 매개 변수 Hello 명령에 전달 scala Hello 것을 찾기 위해 개체를 참조가 포함 main 실행하는 방법을. 동일한 .scala 파일에서 main 메소드로 여러 객체를 가질 수 있습니다.

args 배열에는 프로그램에 부여 된 명령 행 인수가 포함됩니다 (있는 경우). 예를 들어 다음과 같이 프로그램을 수정할 수 있습니다.

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
    for {
      arg <- args
    } println(s"Arg=$arg")
  }
}

그것을 컴파일하십시오 :

$ scalac HelloWorld.scala

그리고 그것을 실행하십시오 :

$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3

Hello World 앱 확장

object HelloWorld extends App {
  println("Hello, world!")
}

라이브 데모

App 특성 을 확장하면 명시적인 main 메소드를 정의하지 않아도됩니다. HelloWorld 객체의 전체 본문은 "기본 방법"으로 처리됩니다.

2.11.0

지연된 초기화

공식적인 문서에 따르면, AppDelayed Initialization 이라는 기능을 사용 합니다 . 즉, 기본 메소드가 호출 된 오브젝트 필드가 초기화됩니다.

2.11.0

지연된 초기화

공식적인 문서에 따르면, AppDelayed Initialization 이라는 기능을 사용 합니다 . 즉, 기본 메소드가 호출 된 오브젝트 필드가 초기화됩니다.

DelayedInit 은 이제 일반 용도로 사용 되지 않지만 App 에서는 특별한 경우로 지원됩니다 . 대체 기능이 결정되고 구현 될 때까지 지원이 계속됩니다.

App 확장 할 때 명령 행 인수에 액세스하려면 this.args 사용 this.args .

object HelloWorld extends App {
  println("Hello World!")
  for {
    arg <- this.args
  } println(s"Arg=$arg")
}

사용하는 경우 App , 개체의 몸이로 실행됩니다 main 방법, 오버라이드 (override) 할 필요가 없습니다 main .

Hello World를 스크립트로 사용

Scala는 스크립팅 언어로 사용할 수 있습니다. 시연하려면 다음 내용으로 HelloWorld.scala 를 만듭니다.

println("Hello")

명령 행 해석기로 실행하십시오 ( $ 는 명령 행 프롬프트입니다).

$ scala HelloWorld.scala
Hello

.scala 를 생략 .scala (예 : scala HelloWorld 입력하면) 러너는 스크립트를 컴파일하고 실행하는 대신 바이트 코드가있는 컴파일 된 .class 파일을 찾습니다.

참고 : scala가 스크립팅 언어로 사용되면 패키지를 정의 할 수 없습니다.

bash 또는 비슷한 쉘 터미널을 사용하는 운영 체제에서 '쉘 프리앰블'을 사용하여 스칼라 스크립트를 실행할 수 있습니다. HelloWorld.sh 라는 파일을 만들고 다음 내용을 내용으로 배치하십시오.

#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")

#! 사이의 부분 #! !# 은 '쉘 프리앰블'이며, bash 스크립트로 해석됩니다. 나머지는 스칼라입니다.

위의 파일을 저장했으면 '실행 가능'권한을 부여해야합니다. 셸에서 다음을 수행 할 수 있습니다.

$ chmod a+x HelloWorld.sh

(이것은 모든 사람에게 권한을 부여합니다 : chmod 에 대한 더 자세한 사용자 집합을 위해 chmod 를 설정하는 방법을 읽어보십시오 .)

이제 다음과 같이 스크립트를 실행할 수 있습니다.

$ ./HelloWorld.sh

스칼라 REPL 사용하기

추가 매개 변수없이 터미널에서 scala 를 실행하면 REPL (Read-Eval-Print Loop) 인터프리터가 열립니다.

nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.

scala> 

REPL을 사용하면 워크 시트 형식으로 스칼라를 실행할 수 있습니다. 실행 컨텍스트가 유지되며 전체 프로그램을 작성하지 않고 수동으로 명령을 시도 할 수 있습니다. 예를 들어, val poem = "As halcyons we shall be" 하면 다음과 같이 표시됩니다.

scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be

이제 우리는 우리의 val 인쇄 할 수 있습니다 :

scala> print(poem)
As halcyons we shall be

val 은 변경 불가능하며 덮어 쓸 수 없습니다.

scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
       poem = "Brooding on the open sea"

그러나 REPL에서 val 다시 정의 할 수 있습니다 (동일한 범위에서 수행 된 경우 일반 스칼라 프로그램에서 오류가 발생합니다).

scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea

REPL 세션의 나머지 동안이 새로 정의 된 변수는 이전에 정의 된 변수를 섀도 잉합니다. REPL은 객체 또는 다른 코드의 작동 방식을 빠르게 볼 때 유용합니다. 스칼라의 모든 기능을 사용할 수 있습니다. 함수, 클래스, 메서드 등을 정의 할 수 있습니다.

Scala Quicksheet

기술 암호
불변의 int 치 지정 val x = 3
변경할 수있는 int 값 할당 var x = 3
명시 적 유형으로 불변 값 할당 val x: Int = 27
느슨하게 평가 된 값 지정 lazy val y = print("Sleeping in.")
함수를 이름에 바인딩 val f = (x: Int) => x * x
명시 적 유형의 이름에 함수 바인딩 val f: Int => Int = (x: Int) => x * x
메소드 정의 def f(x: Int) = x * x
명시 적 타이핑을 가진 메소드 정의 def f(x: Int): Int = x * x
클래스 정의 class Hopper(someParam: Int) { ... }
객체 정의 object Hopper(someParam: Int) { ... }
특성 정의 trait Grace { ... }
시퀀스의 첫 번째 요소 가져 오기 Seq(1,2,3).head
스위치가있는 경우 val result = if(x > 0) "Positive!"
첫 번째를 제외하고 시퀀스의 모든 요소 가져 오기 Seq(1,2,3).tail
목록 반복 for { x <- Seq(1,2,3) } print(x)
중첩 루핑 for {
x <- Seq(1,2,3)
y <- Seq(4,5,6)
} print(x + ":" + y)
각 list 요소에 대해 execute 함수 List(1,2,3).foreach { println }
표준 출력으로 인쇄 print("Ada Lovelace")
목록을 영숫자로 정렬 List('b','c','a').sorted