一个月前,我找到了第一份工作,成为一名实习生开发人员,我们的团队使用Scala语言。 在我看来,第一天所有新手开发人员都迷失了。 同时有许多新名称,新技术,一些规则,而且您永远都不知道是什么,绝对所有的东西对您来说都是新的,这是第一项工作。 就我而言,直到面试之前我都没有听说过编程语言。 底线:第一天我筋疲力尽。 请问我如何获得这份工作的? 我知道Java,在采访中我被告知,javista可以很轻松地进入岩石,您不必担心。 但是显然还有一点值得,因为在我面前我第一次看到只有充满文本的屏幕,其中几乎有一半是清晰的。
但是,即使我不了解某些事实也带来了更多不适,但是事实却有很多不同,甚至变量的类型都紧随名称之后,有时甚至根本不存在。
final String str = "abc";
val str = "abc"
该函数的描述方式如下:
int sum(int a, int b) {return a+b;}
def sum(a: Int, b: Int) = {a + b}
而且,Scala还具有控制台REPL(Read-eval-print-loop),例如在Python中。 正如您已经注意到的,分号丢失了。 您可以在没有主程序的情况下运行单页程序,方法和变量的名称可以包含任何字符,并且以任何字符开头,没有规则。 没有静态,但是有Object,也有图元对象,==实际上有equals。 如果该方法没有参数,则不必结束该方法的调用;如果没有参数,则括号也是可选的;如果仅包含一个参数,则可以这样编写:
str.charAt(5);
str charAt 5
另一个有趣的例子:
val res = 1 + 1
不,不只是1加1,这里是对象1,调用+方法,对象1作为唯一参数传递给它,对我来说,这是一个模板中断。
令我震惊的是大卫·波拉克(David Pollack)写的一本精彩的书-斯卡拉的初衷。 这本书以一个短语开头,之后我意识到自己必须读到最后:
! 那伤了我的大脑! 别让我改变看法。 哦,等等...现在疼痛减轻了。 知道了 解决问题的这种不同方式有一些好处。 法学院一年级后,我有这种感觉。 当我开始编写Scala时,我有一段时间感觉到了。
David拥有丰富的编程经验,他在我出生20年前就开始了这项业务,直到他加入Scala之前,他都致力于使用超过10种编程语言。 现在他说:
Scala是一种编程语言,可为开发人员提供无与伦比的体验。
但是,作者诚实地警告说,掌握它并不容易,他花了2年的时间来做到这一点,但他希望我们能更快地做到这一点,他将对此有所帮助。 这不是一本非常简单的书,它涉及与读者进行编程的一些经验。 特别是那些以前用Java编程的人会喜欢它,因为 该语言有很多参考,可以进行比较。
除了Beginning Scala之外,我还阅读了Twitter的Scala School课程,所有课程都翻译成俄文,但David Pollack的书只有英语版本。
除了在岩石和工作源周围进行独立旅行外,Scala Exercises项目还有助于巩固理论,这是非常简单的任务,但是它们非常适合首先修复某些方面并检查您是否仔细阅读并正确理解了所有内容。
我将首先介绍一些我必须理解的最常见,最简单的事情。
选件 简而言之-这是一个容器,其中可以为空(无,看起来像null,但具有map,filter等)的方法,或者仅存在一个值。some(值)及其使用可以使代码更安全,不会抛出NullPointerException,因为您想要这样做,但是您仍然需要从Option中检索干净的数据,这时已经很难忘记编写检查了。
当然,Option有一个get方法,但是不建议使用它,因为在这种情况下,Option的全部内容都丢失了,因为 None.get引发异常。
一些最明显的便利设施:
如果Option为空,很容易返回默认值
optValue.getOrElse(defaultValue)
如果采取任何措施:
optValue match { case Some(value) => action case None => defaultAction }
Scala Beginning中的示例。 路径是包含Person类型的特定数据库
def findPerson(key: Int): Option[Person]
如果找到这样的条目,该方法将返回Some [Person],否则返回None。
现在,我们想通过密钥获取用户的年龄。
def ageFromKey(key: Int): Option[Int] = findPerson(key).map(_.age)
我们不必测试无,方法非常简洁。
模式匹配 。 一开始,我以为这是相同的Java开关,我几乎不会使用它,但事实并非如此。 在Scala中,这是最常用的设计之一。
类型转换:
obj match { case str: String => str case number: Int => number }
您可以添加其他条件并添加默认操作。
obj match { case strWithA: String if strWithA.contains("a") => strWithA case negative: Int if negative < 0 => negative case zero if zero == 0 => zero case _ => defaultAction }
将模式匹配与案例类一起使用非常方便。 Scala开头的示例
Stuff("David", 45) match { case Stuff("David", age) if age < 30 => "young David" case Stuff("David", _) => "old David" case _ => "Other" }
功能介绍首先,在Scala中,函数是实现特定接口或特性FunctionX的实例,其中X是参数的数量,且取值范围为1到22。在此任务栏中,唯一的方法是aplly,该函数被调用。 由于函数是普通实例,因此我们可以从方法和函数中传递和返回它们。
Scala Beginning中的示例。 我们将一个从Int到String的函数传递给响应,它返回带有参数42的该函数的结果。
def answer(f: Function1[Int, String]) = f(42)
或同一件事
def answer(f: Function1[Int, String]) = f.apply(42)
一个非常方便的事情是功能组合器/
在数组中只保留正元素:
arr.filter(value => value > 0)
一个稍微复杂的例子。 从列表的正数计算函数f的值之和。 2种方法:
list.filter(x => x > 0).foldLeft(0)(_ + f(_)) list.filter(x => x > 0).map(f).sum
最后,我想说一下为什么我要写所有这些。 我不想教任何Scala或谈论这种语言,在Habré和Internet上有很多这样的文章,而且很多都是非常有用的。 我的目标仅仅是讲我的故事,这对某人可能很有趣,并且可以帮助和支持同一命运的新来者,而这些新来者刚刚在这块岩石上遇到了命运。 祝你好运! 鼓励有经验的程序员在评论中分享有关新手Scala程序员的发展道路的观点和建议。