【踩坑指南:2025年最新】如何在Linux(Ubuntu)启动第一个Scala Hello World程序(Scala3)

ops/2025/1/8 18:56:27/

如何正确地写出Scala的第一个程序,并且利用Scala3的简洁特性?

在解释器中直接输出Hello world非常简单,只需要直接执行即可:

scala> println("Hello World")
Hello World

但如果我们希望编写一个脚本文件,编译后执行再输出Hello World,却会踩到很多的坑。

错误的尝试1

方案来源:书籍:敏捷硬件开发语言Chisel与数字系统设计

博客:如何运行scala脚本 | 我的站点

首先创建一个.scala文件

vim hello.scala

在这个文件中编写如下代码:

println("Hello World!")

然后执行编译指令

scala hello.scala

之后,他们说这样就可以成功输出Hello world。然而,除了报错你什么都得不到:

jia@J-MateBookEGo:~/scala_test$ scalac hello.scala
-- [E103] Syntax Error: hello.scala:1:0 ----------------------------------------
1 |println("Hello, World!")|^^^^^^^|Illegal start of toplevel definition|| longer explanation available when compiling with `-explain`
1 error found

并不错误,但不太好的尝试2 

经过查找资料,我找到了CSDN的一篇博客,里面记录了Scala的第一个程序,包括网上的课程也是这样讲的:(地址:第一个Scala程序——Hello World!_scala hello world-CSDN博客)

注意,他这里没有写等号,实际上没有写等号也会报错,等号必须写,另外这里必须是object,不可以是class,原因和Scala使用了JVM有关,这里不多赘述

object HelloWorld {def main(args: Array[String]) = {println("Hello, world!")}
}

之后进行编译:

jia@J-MateBookEGo:~/scala_test$ scala hello.scala
Compiling project (Scala 3.6.2, JVM (21))
Compiled project (Scala 3.6.2, JVM (21))
Hello, world!

这里使用scala或者scalac都可以编译成功,只不过使用scala会自动执行。

成功的步骤

这样我们能够成功输出Hello world,但书中和博客应该并非空穴来风,直接编写简洁的函数能否实现功能,答案是可以。我们查询官网:Hello, World! | Scala 3 — Book | Scala Documentation

官网说明,Scala2的第一个程序应该这样写:

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

官网的解释:代码中,在名为 hello 的 Scala object 中,我们定义了一个名称为 main 的方法。 在 Scala 中 object 类似 class,但定义了一个可以传递的单例实例。 main 用名为 args 的输入参数,该参数必须是 Array[String] 类型(暂时忽略 args)。

这和我们上面写的是一致的,但对于Scala3有着更简明的写法:

@main def hello() = println("Hello, World!")

这个@main写不写都可以,并不影响,但必须用def定义。官网解释如下:代码中, hello 是方法。 它使用 def 定义,并用 @main 注释的手段把它声明为“main”方法。 使用 println 方法,它在标准输出 (STDOUT)中打印了 "Hello, world!" 字符串。

这里直接使用scala编译并运行:

jia@J-MateBookEGo:~/scala_test$ scala hello.scala
Compiling project (Scala 3.6.2, JVM (21))
Compiled project (Scala 3.6.2, JVM (21))
Hello, World!

没问题,成功运行了。但官网使用的是scalac,他要求我们使用以下两条指令编译并运行:

scalac Hello.scala
scala hello

事实上,它又报错了:

jia@J-MateBookEGo:~/scala_test$ scalac hello.scala
jia@J-MateBookEGo:~/scala_test$ scala hello
[error]  hello is not a scala sub-command and it is not a valid path to an input file or directory.
Try viewing the relevant help to see the list of available sub-commands and options.scala --help

不是哥们,你官网写的文档也是错的是什么意思,没办法我们只能继续搜索这个报错,在github上找到了解答:Document starting programs compiled by scalac in the current working directory · Issue #3132 · VirtusLab/scala-cli · GitHub

其中的意思大概翻译一些就是:这种写法已经不被支持了,我们早就已经讨论在新的标准中不支持它。

不支持可以啊,那你官网怎么还放着以前的版本,这也太草率了吧,只能说默认学这门语言的不是小白吧。。。。。。

解决方案就是,不能直接使用scala hello执行这个脚本,而需要使用这两条指令中的任意一条:

scala run -cp .
scala run -cp . -M hello

第一条指令运行失败,第二条运行成功。

jia@J-MateBookEGo:~/scala_test$ scala run -cp .
[error]  Found several main classes: hello, hello, hello
You can run one of them by passing it with the --main-class option, e.g.scala run -cp . --main-class helloYou can pick the main class interactively by passing the --interactive option.scala run -cp . --interactive
jia@J-MateBookEGo:~/scala_test$ scala run -cp . -M hello
Hello, World!

总结

成功的运行方式如下:

脚本代码:

@main def hello() = println("Hello, World!")

编译指令:

scala hello.scala

或者:

scalac hello.scala
scala run -cp . -M hello

http://www.ppmy.cn/ops/148535.html

相关文章

计算机网络 (29)网络地址转换NAT

前言 网络地址转换(Network Address Translation,NAT)是计算机网络中的一种重要协议,它主要用于将私有IP地址转换为公共IP地址,以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网(LAN&…

特制一个自己的UI库,只用CSS、图标、emoji图 日后慢用!!!

图片&#xff1a; emoji图标库 --emoji.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Emo…

Python使用pip安装Caused by SSLError:certificate verify failed

最近公司电脑受限&#xff0c;安装conda好像有点问题&#xff0c;不让安装。只能pip硬装了&#xff1a; 使用pip安装的时候一直报错&#xff1a; “ Could not fetch URL https://pypi.org/simple/pyplot/: There was a problem confirming the ssl certificate: HTTPSConne…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…

VisualRules规则引擎语法介绍

VisualRules规则引擎是一款用于处理复杂业务规则的引擎&#xff0c;广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来&#xff0c;以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法&#xff1a; 1. 规则定义 规则通常由 条件…

代码随想录算法训练营day25

代码随想录算法训练营 —day23 文章目录 代码随想录算法训练营前言一、491. 非递减子序列优化 二、46. 全排列三、47.全排列 II四、332.重新安排行程五、51. N皇后(先占个坑&#xff0c;还没做)六、37. 解数独(先占个坑&#xff0c;还没做)总结 前言 今天是算法营的第25天&am…

AI绘画 Stable Diffusion【进阶篇】:Recolor模型实现头发衣服换色

大家好&#xff0c;我是小梁子。 在艺术创作中&#xff0c;颜色的运用至关重要。如今&#xff0c;借助StableDiffusion的Recolor模型&#xff0c;你只需一键操作&#xff0c;就能轻松实现头发和衣服的换色。本文将带你深入了解Stable DiffusionRecolor模型的使用方法&#xff…

回顾 Tableau 2024 亮点功能,助力 2025 数据分析新突破

2024 年&#xff0c;Tableau 用更智能、更高效的工具&#xff0c;重新定义了数据分析的可能性。 回顾 2024 年&#xff0c;Tableau 凭借一系列创新功能&#xff0c;在数据可视化与分析领域再次引领潮流。无论是深度整合 AI 技术&#xff0c;还是优化用户体验的细节&#xff0c;…