如果把裸体看作计算机的本质的话,程序语言就是衣服。
如果把汇编比喻成最原始的树叶衣服的话(这种衣服想遮那,挡那),那么C语言就是最原始的编织物的衣服了。也就是说,C语言已经出现成块的布了,用这些布我们可以拼凑出各种形制来。
那么java,我觉得最象一个漂亮的裙装(短裙性感的那种),而scala则象现在混搭的穿衣风格。
抱歉,纯函数式(比如scheme)的我曾经用过一些,只是觉得可读性太差,写起来实在是不习惯。这些东西在我看来更像穆斯林的服装,全身都裹着,虽然统一,但却郁闷。
这两天,我在研究scala,主要是读《program in scala》,再写一些测试的代码。
并且把我原来用java写的一个程序改成了scala。
我确实很喜欢这种混搭的风格,而且,scala内在的,从概念上,很统一。
其实,它的思想还是oo的,只不过它把函数也作为一种对象独立出来罢了。
不过,scala的编译器做的比较技术,也就是说,它的语法弄得比较灵活,但却并不显得复杂。
比方说,你可以println("hello"),也可以println "hello",也可以println {"hello"}。
虽然如此,它并没有违背它的核心理念,也就是“every thing is object,every operate is method”。这是语法分析和语义分析的区别,也就是说,把所有的形式翻译成,对象和方法的结构(语义),再以这种理念来树立语言的核心精神。这使得scala变得统一,它只加入了几个控制语句,其他的都交给对象和函数系统。它并没有象scheme一样执着,而是适当的加入了那么几个控制语句,这是我欣赏的地方——不要拘泥于什么东西。当然这几个语句不是对象,不过,不用担心,编译器会把他们变成对象的——我是这么理解的。
scala编译器的一个非常方便的功能是类型的推导,这减少了敲代码的量,并且使代码容易理解,感觉非常的自然。你认为编译器应该能明白的,它就能明白,就是这样。
这是我写的一个小例子,这是个hello world加强版:
import scala.collection.mutable.Set
class Dog[T](var color: String){
val childs=Set[T]()
def apply()="""hello dog every day is holeday,dkkskdkfs
dskdkskdksk"""
def add(x: Int,y: Int):Int={
x+y
}
def hello(dog: String){
println("hello dog! "+dog)
}
def pf(p: PartialFunction[Any,Unit]){
//注意,“部分函数”这个东西
p.apply(color)
}
def an(body: => Unit){
body
}
def lookat(){
println("i am in Dog, and i am lookat")
}
}
object Main extends Application{
val mydog=new Dog[Int]("green"){
override def lookat(){
println("i am lookat")
}
}//this is a Refinement
println(mydog.color)
mydog.color="red"//not need java's getter and setter
println {mydog()}//对象的函数式用法,调用apply方法
println(mydog.add(1,2))
mydog hello "ddkks"
mydog hello { "sssss" }
mydog hello ("mmmmms") //单参数的多种调用方法
mydog pf {case "green" => println("ooooooo喵ooooooo")}//case block会被编译成一个PartialFunction,这种形式在Actor里很常见
mydog an { println("ok,ok,ok") }//这是个Call-by-name
mydog.childs+3
mydog.childs+4//集合Set的使用
mydog.childs.foreach(println)
mydog.lookat
mydog.asInstanceOf[Dog[Int]].lookat//asInstanceOf[SomeType]和java的强制转型是一样的
}
这仅仅是九牛一毛。
scala的好多特性我都没用到,不过,这是基本的,我觉得至少要知道这些。
还有好多地方我还不知道该怎么用,功能确实比较繁杂。
scala的话,ide的支持不行(我发现象eclipse的java环境那么好的东西,实在是凤毛麟角),所以ant是必不可少的。再搞个编辑器就行了,scala支持好多编辑器。
顺便提供我的build.xml,供参考:
<project name="scala play" default="run" basedir=".">
<property name="sources.dir" value="src" />
<property name="build.dir" value="build/classes"/>
<property name="lib.dir" value="lib"/>
<property environment="env"/>
<property name="scala.home" value="${env.SCALA_HOME}" />
<target name="init">
<property name="scala-library.jar" value="${scala.home}/lib/scala-library.jar"/>
<mkdir dir="${build.dir}"/>
<mkdir dir="${sources.dir}"/>
<mkdir dir="${lib.dir}"/>
<path id="build.classpath">
<pathelement location="${scala-library.jar}"/>
<pathelement location="${build.dir}"/>
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<taskdef resource="scala/tools/ant/antlib.xml">
<classpath>
<pathelement location="${scala.home}/lib/scala-compiler.jar" />
<pathelement location="${scala-library.jar}" />
</classpath>
</taskdef>
</target>
<target name="build" depends="init">
<scalac srcdir="${sources.dir}"
destdir="${build.dir}"
classpathref="build.classpath"
deprecation="yes"
encoding="gbk">
</scalac>
</target>
<target name="test" depends="build">
<java classname="Main"
fork="true"
classpathref="build.classpath">
</java>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
分享到:
相关推荐
Lambda-scala Lambda微积分在Scala中的实现 表达方式 Expr :: =名称(名称:字符... 首先,让我们弄清楚一些定义: val x = Name(“ x”) //->“ x” val y = Name(“ y”) val f =名称(“ f”) val a =名称
我还用它来弄乱Dotty / Scala3。其他人可能会发现它很有用。 我计划使用此库和存储库来浏览Barto和Sutton的书。 现在,我已经将Breeze jars提交给了回购协议,因为我必须使用我的JVM版本对其进行编译才能使其正常...
Kerr Scala扩展(KSE) ... 如果您正在使用其他产品,则可以从上面弄清楚。 或者只是分叉存储库并运行sbt package 。 杰纳尔 Jsonal是专为快速读取数字数据而设计的JSON解析器。 真的很快。 它也应该很容易使用。
它都是单线程的,所以你不必弄乱消息。 适用于任何类型的 2D opengl 基元的庞大绘图库。 从 ttf 文件加载和使用字体(基于 'Slick2D' api,但有改进)。 i18n:从 xml 文件加载字符串甚至整个接口。 运行时语言更改...
swagger)逆向工程文档并不容易,并且路由没有键入(因此如果您不小心更改了从完整返回的类型,您可能会弄乱您的客户端) 备择方案: , , , 光滑 () 我选择 slick 是因为我喜欢它几乎是 ORM 的表格方式,它的主要...
俚语 一种松散地基于Scala和Haskell语法的玩具语言。... 结果是,当需要时间来弄清楚如何做效果时,就是只允许最后一个表达式具有效果。 在最后一个表达式之前运行效果而未给它们分配值,则将来可能会导致编译错
潜入这个行业,弄脏我的手。 这就是为什么我开始这个自我激励的独立项目的原因。 在Heroku服务器上尝试这个很棒的。 阅读以下一系列相关文章: :使用带有Tweepy,MySQL和Python的Streaming Twitter API收集...
Akka.NET是一个强大的开源框架,它源自于Scala语言中的Akka库,被移植到.NET平台上,专为构建高度可伸缩、容错性强的并发和分布式系统而设计。在这个项目中,我们将深入探讨Akka.NET的核心概念,包括不同类型的角色...
从前听大神同事强老师说IntelliJ IDEA 功能强大,是Jet Brains 公司开发商业IDE(集成开发环境),同时支持Java, Scala 和Groovy。商业IDE即IntelliJ 是一款收费的IDE,当然了其实也有免费的社区版本,但是很多功能...
百度地图开发java源码 ...另外也在20160810弄了一个没有数据的project,方便下载: 具体博客目录: 1.Spark基本学习篇: spark学习1之examples运行: spark学习2之OutOfMemoryError错误的解决办法: spark学习3之exa
描述中的“为什么还要50个字节,还要弄些占位符”可能指的是文件大小的最小要求或某种编码规范,但这并不是JDK本身的功能或特性。 **标签:“jdk1.7”** JDK 1.7,也被称为Java SE 7(Java Standard Edition 7),...
尝试编程语言,如 scala、python、java。 无论我觉得有趣的事情,(它在其他语言中的样子我都试过了。) 显然,java 只是为了完成,直到现在,我觉得其他语言在从任何地方获取好东西的大部分时间都得到了更好的发展...
它处理例行任务,例如在表单上填写预填充的值,弄清楚提交表单的位置,使您腾出时间来编写脚本。 这是一个例子: import io.gatling.core.Predef._import io.gatling....
Copygrinder-RESTful CMS Copygrinder是一个足够的CMS。 它为内容发布者提供了一个不错的... 使用它,您可以花费大量时间解决实际问题,而不必弄清楚如何配置或扩展extend肿的整体式CMS运行时。 为什么不加入的对话?
要弄清楚网络罐子是否总体上具有足够的吸引力来抛弃现有的,完善的npm / bower生态系统。 通过尽我所能进行这个项目,我可以将第一项从清单中剔除,但不幸的是,我还发现整个sbt-web设置很费力并且有害地重复。 ...