当前位置:首页 » 网页前端 » scala运动脚本
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

scala运动脚本

发布时间: 2022-02-10 22:24:49

❶ 如何调用scala里的val 值

条件表达式

Scala的if/else语法结构和Java或C++一样。不过,在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。例如:

if (x > 0) 1 else -1

上述表达式的值是1或−1,具体是哪一个取决于x的值。你可以将if/else表达式的值赋值给变量:

val s = if (x > 0) 1 else -1

这与如下语句的效果一样:

if (x > 0) s = 1 else s = -1

不过,第一种写法更好,因为它可以用来初始化一个val。而在第二种写法当中,s必须是var。

(之前已经提过,Scala中的分号绝大多数情况下不是必需的。)

Java和C++有一个?:操作符用于同样目的。如下表达式

x > 0 ? 1 : -1 // Java或C++

等同于Scala表达式 if (x > 0) 1 else −1。不过,你不能在?:表达式中插入语句。Scala的if/else将在Java和C++中分开的两个语法结构if/else和?:结合在了一起。

在Scala中,每个表达式都有一个类型。举例来说,表达式 if (x > 0) 1 else −1的类型是Int,因为两个分支的类型都是Int。混合类型表达式,比如:

if (x > 0) "positive" else -1

上述表达式的类型是两个分支类型的公共超类型。在本例中,其中一个分支是java.lang.String,而另一个分支是Int。它们的公共超类型叫做Any。(详细内容参见8.11节。)

如果else部分缺失了,比如:

if (x > 0) 1

那么有可能if语句没有输出值。但是在Scala中,每个表达式都应该有某种值。这个问题的解决方案是引入一个Unit类,写做()。不带else的这个if语句等同于

if (x > 0) 1 else ()

你可以把()当做是表示“无有用值”的占位符,将Unit当做Java或C++中的void。(从技术上讲,void没有值但是Unit有一个表示“无值”的值。如果你一定要深究的话,这就好比空的钱包和里面有一张写着“没钱”的无面值钞票的钱包之间的区别。)

说明:Scala没有switch语句,不过它有一个强大得多的模式匹配机制,我们将在第14章中看到。在现阶段,用一系列的if语句就好。

注意:REPL比起编译器来更加“近视”——它在同一时间只能看到一行代码。

举例来说,当你键入如下代码时:

if (x > 0) 1

else if (x == 0) 0 else -1

REPL会执行 if (x > 0) 1,然后显示结果。之后它看到接下来的else关键字就会不知所措。

如果你想在else前换行的话,用花括号:

if (x > 0) { 1

} else if (x == 0) 0 else -1

只有在REPL中才会有这个顾虑。在被编译的程序中,解析器会找到下一行的else。

提示:如果你想在REPL中粘贴成块的代码,而又不想担心REPL的近视问题,可以使用粘贴模式。键入:

:paste

把代码块粘贴进去,然后按下Ctrl+D。这样REPL就会把代码块当做一个整体来分析。

语句终止

在Java和C++中,每个语句都以分号结束。而在Scala中——与JavaScript和其他脚本语言类似——行尾的位置不需要分号。同样,在}、else以及类似的位置也不必写分号,只要能够从上下文明确地判断出这里是语句的终止即可。

不过,如果你想在单行中写下多个语句,就需要将它们以分号隔开。例如:

if (n > 0) { r = r * n; n -= 1 }

我们需要用分号将 r = r * n 和 n -= 1 隔开。由于有},在第二个语句之后并不需要写分号。

如果你在写较长的语句,需要分两行来写的话,就要确保第一行以一个不能用做语句结尾的符号结尾。通常来说一个比较好的选择是操作符:

s = s0 + (v - v0) * t + // +告诉解析器这里不是语句的末尾

0.5 * (a - a0) * t * t

在实际编码时,长表达式通常涉及函数或方法调用,如此一来你并不需要过分担心——在左括号(之后,编译器直到看到匹配的)才会去推断某处是否为语句结尾。

正因如此,Scala程序员们更倾向于使用Kernighan & Ritchie风格的花括号:

if (n > 0) {

r = r * n

n -= 1

}

以{结束的行很清楚地表示了后面还有更多内容。

许多来自Java或C++的程序员一开始并不适应省去分号的做法。如果你倾向于使用分号,用就是了——它们没啥坏处。

块表达式和赋值

在Java或C++中,块语句是一个包含于{ }中的语句序列。每当你需要在逻辑分支或循环中放置多个动作时,你都可以使用块语句。

在Scala中,{ }块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。

这个特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如,

val distance = { val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy) }

{ }块的值取其最后一个表达式,在此处以粗体标出。变量dx和dy仅作为计算所需要的中间值,很干净地对程序其他部分而言不可见了。

在Scala中,赋值动作本身是没有值的——或者,更严格地说,它们的值是Unit类型的。你应该还记得,Unit类型等同于Java和C++中的void,而这个类型只有一个值,写做()。

一个以赋值语句结束的块,比如

{ r = r * n; n -= 1}

的值是Unit类型的。这没有问题,只是当我们定义函数时需要意识到这一点。

由于赋值语句的值是Unit类型的,别把它们串接在一起。

x = y = 1 // 别这样做

y = 1的值是(),你几乎不太可能想把一个Unit类型的值赋值给x。(与此相对应,在Java和C++中,赋值语句的值是被赋的那个值。在这些语言中,将赋值语句串接在一起是有意义的。)

输入和输出

如果要打印一个值,我们用print或println函数。后者在打印完内容后会追加一个换行符。举例来说,

print("Answer: ")

println(42)

与下面的代码输出的内容相同:

println("Answer: " + 42)

另外,还有一个带有C风格格式化字符串的printf函数:

printf("Hello, %s! You are %d years old.\n", "Fred", 42)

你可以用readLine函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readDouble、readByte、readShort、readLong、readFloat、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串:

val name = readLine("Your name: ")

print("Your age: ")

val age = readInt()

printf("Hello, %s! Next year, your will be %d.\n", name, age + 1)

❷ Scala 适合作为脚本语言使用吗

从语法和库的角度来说,可以,写的脚本行数和ruby差不多
但是运行时需要java虚拟机还要安装scala,有点不方便
java虚拟机启动还是有点慢,运行scala 脚本文件名.scala 时会有一下卡顿的感觉,不是太爽

❸ scala语言用什么语言开发的

要问答你这个问题,就应该要去看看scala的源码:

如果你跟我一样想要找出cpp结尾的文件,或c编写的文件,发现你找不到,你只能找到java或scala编写的文件还有一些脚本文件

❹ Scala 是一门怎样的语言,具有哪些优缺点

以前在这个版块也答过关于Scala的问题,但那更多的是知识普及,而没有谈Scala是什么,做什么,以及有怎样的特点。

Scala可怕的地方在于人人都能对它说上一二,但是不一定每个人都能明白。查看这个版块的帖子,有人把它当做Java的延伸版(一个UPenn宾大的学生Justin Kim ——此人目前在沃顿混得风生水起,当着我的面说Scala是在JVM上的脚本语言),有人把它当做JVM上的C++,有人觉得这是面对对象语言和函数语言的简单混合,有人觉得这就是Haskell,而且也还不如Haskell强。对Scala的偏见(或者是错误的见地)达到了很高的地步,Martin Odersky马丁·奥德斯基(Scala的发明者,EPFL教授)在今年夏天的Scala Day旧金山大会上发出了这张着名的玩笑照片:
gt;

这个图片上的翻译是:“Scala唯一的作用是将人引向Haskell”(原谅我没法完全直译)。马丁·奥德斯基以此作为一个笑话,说他该把Scala改一下名字,叫做Hascalator,还请人设计了一个Logo。

不同的语言有不同的特点,同时也带来不同的优势。如果不能理解Scala的特点,就不可能知道如何运用Scala,以及发挥其最大的优势。一些语言有很显而易见的优势,也很容易理解,比如Python,Python的哲学(Zen of Python PEP 20 -- The Zen of Python),我很早的时候曾经觉得有道理,尤其是One way to do it(一种方法做一件事情),理由是对任何任务,虽然可以采用很多方法,但总有最好的一种方法,通过在语言或者哲学层面这样定义后,能简化程序员的任务,从而达到提高效率的方法。但经过一段时间的思考后,我突然发现Python其实并不是“一种方法做一件事”的哲学,而是“一种方法做一百万件事情”的哲学:极其有限的数据结构(只有四个: List, Tuple, Dictionary, Sets),以及不能查看时间复杂度的访问方法,比如鼓励人们使用for x in list。

这种处理方式能达到Python最初的打算:发明一种每个人都能使用的简易语言,但是对于追求速度和效率的程序员而言,这几乎是略带噩梦性质的。当然,这不是说Python很慢,通过各种优化(比如NumPy/SciPy中的),以及Cython这样的将Python直接翻译为C/C++语言又重新通过C_Mole方式读回Python环境的编译器,性能可以得到不少提升,但是仍旧,Python并不追求快。

再举一个语言的例子:Java。Java的特性或者优势何在?Java的第一个优势在于它是第一个系统提供模块化(mole)设计的语言(在此之前有Smalltalk存在,该货是OOP的鼻祖)。在Java之前,炒程序员鱿鱼是很困难的事情,那些C/C++程序员,以及而且尤其是那些Lisp程序员,一旦炒掉他们,新来的人没有十天半个月,甚至半年,是不可能搞懂前任人士的代码的。每个人的代码有自己的逻辑,自己的思路,写上个数万行任谁来看都头疼。这也是为什么Paul Graham保罗·格雷厄姆(写了《黑客与画家》)讲他给雅虎做了一个用Lisp写成的在线商店的案例,在他离开后,雅虎根本没法维护他写的代码,因为数万行Lisp没人能弄得很清楚。

Java的模块化,给企业、大公司带来了第一道曙光,模块化之后,这些公司不再给程序员一整个任务,而是一大块任务的一小块。接口一定义,虚拟类一定义,换谁上都可以,管你是保罗·格雷厄姆这样的明星程序员,还是一个新来的大学生,程序员不听话就直接开除,反正模块化之后,开除程序员的成本大大降低,这也是为什么谷歌、甲骨文(这货最后收购了Java)一类的公司大规模的推崇Java,还一度提出了模块化人事管理的理念(把人当模块化的积木一样随时移进移出)。

过度企业化后,这延展出了Java的第二个特性,束缚手脚。保罗·格雷厄姆在《黑客与画家》中写道,Java属于B&D(捆绑与束缚)类型的语言。为何束缚手脚?因为要让新手和明星程序员写出类似质量的代码,尽可能的抹消人的才华对程序的影响。不同于C/C++,老手和新手写出的Java代码不会有上百倍的耗时差距。但同样也导致了Java的一个弱点——不容易优化。很多优化Java代码的程序员必须要对JVM(虚拟机)进行优化,实际上增大了很多任务难度。

通过Python和Java这两个语言的优缺点,返回来看Scala,就能瞬间明白Scala的定位了。

首先,Scala不把程序员当傻子。当马丁·奥德斯基宣布Scala 2.12将要简化语法,推出Scala "Don Giovanni"项目的时候,在视频中说的很清楚:“Scala现在是为聪明人创造的,以后也是为聪明人服务的。”所以不同于Python让程序员用一种方法做所有事情,Scala提供一整套工具,让程序员自由选择,无论是mutable数据结构,immutable数据结构,并行(parallel)数据结构。然后在这些选择中,Scala再针对他们进行算法层面的特殊优化。Scala相信程序员的聪明才智,让程序员自行选择合适的结构,以针对变化万千的任务需求,这点是Scala做得极好的地方。

再者,有人会说immutable数据结构占用内存,或者速度很慢。这是真的,但这不是Scala的错,而是这些结构就是这样定义的。这里讲的是Scala集合的运行速度,是一个来自Goldman Sachs的程序员讲他们为Java写的集合库(GSCollection)速度和内存消耗,但同时比较了gs-collection(goldmansachs/gs-collections · GitHub),Java,和Scala库的速度。最后Scala的可变集合mutable原生库完爆Java,和gs-collection基本持平。

Scala的第二个优势,相较于Java而言,则是相信程序员的优化能力。在Scala with Style讲话中(),马丁·奥德斯基说:“很多程序员会告诉我,他们一般会重构他们的Scala代码两三次,甚至三四次。”这听起来似乎非常的没有效率,但Scala就是这样的语言,每一次重构,代码的性能或者是可读性都会有极高的提升。

之前就有人提到过,Scala新手和老手写出来的代码完全会呈现两种不同的风格,甚至新人根本不能读懂有经验的Scala程序员所写的代码,有人于是戏称:“太好了,这样的话我们部门的实习生就不能乱碰我写的代码啦!”但其实不仅风格不同,执行效率差距也一定是巨大的。Scala提供一整套工具,但是要明白什么时候用拿一种工具,哪些算法能够随意调用,哪些算法不能,这一定要依靠经验、研究和学习以及对源代码的理解才能得知。最简单的例子,Scala的foreach()方法是高度优化过了的(尤其针对Range结构和Vector结构),但是fold()就不一定了。或者当受到诱惑想用zipWithIndex()的时候,一定要明白这是两次循环,最好改用Vector(...).indices.foreach()的方法,或者用.view来推迟执行。

像这样的地方还有很多。所以在这个层面上来讲,简直和C++非常的相似。从另外一个层面来讲,不仅仅是要理解语言层面的优化,Scala作为一个社区而言,是非常追求运行速度的。Ruby社区就完全不同了,Ruby曾经是推特的主要语言。推特的团队找到了Ruby团队,说,你们能不能让Ruby运行的快一点,我们有这个这个和这个建议。Ruby直接把这些建议拒绝了,因为它们会增加语言复杂度,让Ruby不能继续做一个“fun”(好玩)的语言。而Python直接就立志做一个“Simple”(简单)的语言了。于是推特只好将后台换做Scala和Java的结合。有一位在推特工作的知乎友人在我的一个回答下留言说推特换用Scala后,TypeSafe(Scala的母公司)还送去了一个蛋糕。

为了追求速度,Scala社区是绝对不会管所谓的“简单”或者是“好玩”,怎样有效率就怎样弄。与其专注于JVM的改进,Scala社区大部分在编译器上下功夫,比如很着名的Miniboxing(Miniboxing),这是一个编译器增进器。Miniboxing做的是什么呢?只做一件事:防止auto-boxing和auto-unboxing。所有的泛型,尤其是原生类泛型(Primitive Types),诸如Int、Double等等,在进行各种操作的时候会自动取出和装回它们所属的类中去——这个我解释的不太好,但是可以看这里(Java 自动装箱与拆箱(Autoboxing and unboxing))。

Miniboxing这样的插件可以让所有的原生类泛型再也不用自动装拆箱,从而将Scala的运行速度提升1.5倍到22倍()。当然这样的东西可不是白来的,这是马丁·奥德斯基的PhD博士学生做的一个研究项目,然后为OOPSLA写了一篇论文(),所以怪不得这玩意Scala可以有,但其他语言想要有都没有。

另一个Scala的很大优势就是所谓的Macro——宏。宏本身作为元编程而言,其实和运行速度是没有什么太大关系的,反而,因为对反射(Reflect)的利用,可能会影响到速度。但Scala社区对宏的理解显然和最初的设计理念有偏差。因为Scala本身是没有传统意义的循环的(for-loop),所以很多时候循环必须利用while或者foreach。但是部分追求效率的Scala程序员们利用宏为Scala写了一个传统循环,叫做cfor,被收录在Spire(non/spire · GitHub)数学计算库中。cfor的写法如下:

import spire.syntax.cfor._// print numbers 1 through 10cfor(0)(_ < 10, _ + 1) { i =>
println(i)}

而这玩意运行效率如何呢?文章中做了一次测评,将cfor和zip写的一个算法作比较——在公布结果之前,我想说的是,zip并不是一个高度优化的方法,所以本身就慢很多,cfor用了26.1毫秒运行,zip方法用了7.4 秒运行,这几乎是284倍的速度差距。

通过这两点,Scala的一个优势就很明显了——多样化。当需要写简单的代码,像Python一样当脚本语言使用时,Scala提供大量的原生方法和数据结构,可以很轻松的写出比较复杂的操作。但当需要速度的时候,又可以通过重构来获取数十倍或者上百倍的速度提升。通过Miniboxing一类的编译器增强器,Scala在某些操作的速度是必定超过Java的。

Scala的第二个优势就是——一帮勤劳勇敢的PhD博士生。二十一世纪的程序语言和二十世纪的程序语言已经不能比拟了。那个年代的普通人(甚至是学生)还能任意发明一下语言,稍微把编译器优化几次就能上得了厅堂(比如那一大堆Lisp方言),到了这个年代,编译技术已经达到了很复杂的程度(虚拟机技术也是如此),优化和语义理解,程序语言的定义与延展,再也不是随便任何人都能搞定的工作了。作为编程语言方面的教授,马丁·奥德斯基不断的将最前沿的学术界成果转移到Scala这个语言中,还让他的博士学生发展出新的,让语言运行得更快的方法,这些都是其他语言,尤其是Python、Ruby、甚至是Go都没有的优势。

当然,说了这么多,总会有人说了,Scala如果像C++一样难,又追求速度的话,为什么不直接去学C++,原因很简单——现在有很多在JVM上面写成的软件啊!大家又不是Haskell程序员,压根不打算一切自己写呐。

❺ 我怎么能语法检查Scala脚本,执行脚本,生成类文件

和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命

令组成的,例如先前讲过的

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
其实是三条命令,if [ -f ~/.bashrc ]是第一条,then . ~/.bashrc是第二条,fi是第三条。如果两条命令写在同一行则需要用;

号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then

后面当作一条命令处理。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令

的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elif、else或者fi后面的子命

令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束。见下例:

#! /bin/sh

if [ -f /bin/bash ]
then echo "/bin/bash is a file"
else echo "/bin/bash is NOT a file"
fi

if :; then echo "always true"; fi
:是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。此外,也可以执行/bin/true或/bin/false得到真

或假的Exit Status。再看一个例子:

#! /bin/sh

echo "Is it morning? Please answer yes or no."
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Good afternoon!"
else
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
exit 1
fi
exit 0
上例中的read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中。
此外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性,很多Shell脚本喜欢写成这样:
test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)
&&相当于“if...then...”,而||相当于“if not...then...”。&&和||用于连接两个命令,而上面讲的-a和-o仅用于在测试表达

式中连接两个测试条件,要注意它们的区别,例如,
test "$VAR" -gt 1 -a "$VAR" -lt 3
和以下写法是等价的
test "$VAR" -gt 1 && test "$VAR" -lt 3

#!/bin/bash
echo "Enter your name: "
read A
if [ "$A" = "GS" ];then
echo "yes"
elif [ "$A" = "UC" ];then
echo "no"
else
echo "your are wrong"
fi
(注意:if、elif后要有空格,[]前后有空格,=前后有空格)

#!/bin/bash
read -p "Enter your name: " A
if [ "$A" = "GS" ];then
echo "yes"
elif [ "$A" = "UC" ];then
echo "no"
else
echo "your are wrong"
fi

❻ 如何让Scala脚本快速运行

#!/bin/sh
exec scala "$0" "$@"
!#

println("Hello, iteblog!!")
args foreach println

我们将这段代码保存到test.sh文件里面,然后运行它:
[[email protected] iteblog]$ time sh test.sh
Hello, iteblog!!

real 0m1.070s
user 0m0.380s
sys 0m0.031s

我们可以看出,这么简单的程序都花费了1.07s才输出结果。这是因为每次运行的时候都会编译里面的内容,编译完才会运行脚本。值得高兴的是,我们可以将编译的内容保存下来,然后以后运行的速度就会加快。Scala解析器提供了
-savecompiled参数,可以将编译的内容保存。所以修改后的代码如下:
#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#

println("Hello, iteblog!!")
args foreach println

运行这个脚本,我们可以发现第一次运行的速度还是很慢,但是当程序运行完,我们可以在同一目录下发现一个名为test.sh.jar的jar文件,这就是编译之后的class文件。第二次运行的时候,Scala会检查该脚本是否修改了,如果没有修改,会直接使用之前编译好的test.sh.jar文件,所以以后运行速度会很快:
[[email protected] iteblog]$ time sh test.sh
Hello, iteblog!!

real 0m0.298s
user 0m0.292s
sys 0m0.030s

我们来看看test.sh.jar里面的内容:
[[email protected] iteblog]$ jar -tvf test.sh.jar
75 Wed Dec 16 19:17:32 CST 2015 META-INF/MANIFEST.MF
832 Wed Dec 16 19:17:32 CST 2015 Main$$anon$1.class
595 Wed Dec 16 19:17:32 CST 2015 Main.class
1097 Wed Dec 16 19:17:32 CST 2015 Main$$anon$1$$anonfun$1.class
547 Wed Dec 16 19:17:32 CST 2015 Main$.class

我们可以看出这些就是编译后的class文件,我们可以通过scala命令去运行里面的类:
[[email protected] iteblog]$ scala -cp test.sh.jar Main
Hello, iteblog!!

❼ Scala和java比较

1、 scala可以编写脚本,编写一个.scala的脚本代码,直接用同scala x.scala进行执行。
但同时scala也可以类似java,通过scalac编译为.class等形式,基于编译执行。
2、 scala可以在交互式的命令中直接编码运行。
3、 支持隐式变量定义,通过var关键词定义一个变量,具体变量类型在赋值后,scala自行进行类型推断。例如var a = List(1,2,3)
4、 常量定义用val 关键词定义
5、 没有静态类型,通过object 定义单例类,main方法就是放在object类型中。

❽ scala是编程语言还是脚本语言

按传统,程序语言分编译语言和解释语言。编译语言要把源程序编译成2进制可执行程序再运行。而解释性语言,即所谓脚本语言,不需预先编译,而可在解释器的解释下,直接解释执行。
我不熟悉scala,看上去scala像似 是一种封装式的东西,例如,封装的 java 式的东西 要编译成 bytecode 后执行。 类似 ruby, python 之类的东西也许可以解释执行。scala 好像没有自己的虚拟机,对 scala 的争论 不少。

❾ 如何让Scala脚本快速运行

可以加参数,编译成jar,下次运行会加速