有没有人是学日语的呢?
今天献上一篇日文吧,然后姐姐我给大家翻译翻译.
初遇Scala
容我简短地为Scala和编译器写上两句吧.不过在这简短的文字里主要还是为有一定编程经验并且想要琢磨一下Scala能做些什么的人而写的喔.也就是说起码你要懂得何为面向对象编程,特别是还要有一定的Java基本功.
第一个Demo
(前两天我写了Scala的第一个Demo,不过是写在WorkSheet上的,今天翻译的这篇文字是直接写了一个object)
作为第一个Demo,就写一个最基本的Hello World项目吧.虽说不是那种能够诱惑你感兴趣的魅力Demo,但是这可是就连小白也能看懂Scala用法的最便捷的演示喔.就让你感受一番吧:
object HelloWorld {
def main(args: Array[String]): Unit = {
println(“Hello, world!”)
}
}
这个项目的结构,应该是和Java有着很深的相似度吧(都是一个爹生的,哈哈).也有程序入口叫main的这个主方法,“作为参数接收命令行参数(字符串数组)”—(原文翻译过来是这样的,但是很难理解吧,其实就是这里的main和Java的main是一样的,args是参数,而参数是个数组Array,[]则表示泛型,String为该泛型是字符串类型.而Unit=表示无返回值的意思.虽然写起来和Java不太一样,但是大体是一致滴,至少与我而言也是如此,嘻嘻-------之翻译有话说)方法体只执行一次,以比较友善的招呼方式将事先就写好的println方法作为参数执行.(哈哈,友好的方式,把println方法作为参数,这是什么奇怪的说法,我感觉不太习惯啊).主方法没有返回值(该方法像例行手续).因此,返回值类型声明为Unit.
和Java存在违和感的地方是把含有main的主方法声明为object吧.Scala用object声明的话,一般上是作为单例对象,只拥有一个实例.Demo上的声明,也就意味着在声明HelloWorld为类名的同时,也声明了该类只有唯一一个实例(叫做HelloWorld).该实例只在需要时,在第一次使用的时候会被new出来.
嗅觉敏锐的同志们也许已经注意到了主方法没有被声明为静态方法了吧.这个呢是因为Scala没有静态成员喔(方法里或者字段).定义静态成员的话,在Scala的项目里是将其声明为单例对象.(感觉说法怪怪的,其实于Scala而言,声明为object类的就是静态类,和Java一样可以用类名调用方法及变量.)
编译刚才的Demo
要编译刚才那个Demo的话,就要使用scalac(是不是和javac一样).scalac和绝大部分的编译器一样运行.接收源文件和将若干个选项作为参数,编译成一个或者复数对象文件.被编译的项目文件是标准的Java类文件.(简直说的不像人话,哈哈,我都没懂,为了方便大家理解,我截了个图来帮助大家理解下.在scala源文件编译之后会生成两个文件,一个是.scalac源码文件,另一个是.class字节文件,也就是说,scala像是一个漂亮的包装袋,将其剥去其实里面就是和java一样的,所以可以编译成.class文件,再由Jvm执行.)
上述的项目以HelloWorld.scala为名作为文件保存,按下面那行命令> scalac HelloWorld.scala可以进行编译.(大于号>是提示符,请不要输入.)
就翻译到这吧,感觉自己给自己挖了个坑,这篇文章写得有些东西我不是很认同,也不能说写得不是很好,因为日本人说的有些理论和我们中国人对计算机理论的理解在某些地方是有点歧义的吧,至少我是这么觉得的,之前看Java的时候也有些地方自己没弄很明白,不过Java相对scala更成熟吧,所以可以找很多资料来对比.不多说了,这篇文章就翻译到这吧,我附上全文,但接下去的就不翻译了,好不容易翻译了的部分,感觉不想让自己的时间白花了,所以还是会贴上.
以下是剩下的文章:
これにより、カレントディレクトリに数個のクラスファイルが生成されます。 そのひとつは HelloWorld.class というもので、scala コマンドを使って直接実行可能(次の章で説明)なクラスを含んでいます。
例を実行する
一度コンパイルされると、Scala プログラムは scala コマンドを使って実行できます。 その使い方は、Java プログラムの実行に使われる java コマンドとよく似ており、同じオプションを受け入れます。 上の例は以下のコマンドを使って実行でき、期待される結果を生成します。
scala -classpath . HelloWorld
Hello, world!
Java とのインタラクション
Scala の強みの1つは、Java コードと相互作用するのがとても簡単なことです。 java.lang パッケージのすべてのクラスは初期設定でインポートされています。 他のクラスは明示的にインポートされる必要があります。
これを実演する例を見てみましょう。 現在の日付を取得し、特定の国たとえばフランスの慣例に従って書式設定したいとします (他の地域、例えばスイスのフランス語を話す範囲も同じ慣例を使います)。
Java のクラスライブラリは、強力なユーティリティクラス、例えば Date や DateFormat を定義しています. Scala は Java とシームレスに相互運用できるので、Scala クラスライブラリに同等のクラスを実装する必要はありません。 対応する Java パッケージのクラスをただインポートするだけです。
import java.util.{Date, Locale}
import java.text.DateFormat._
object FrenchDate {
def main(args: Array[String]): Unit = {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}
Scala のインポート文は Java と同等のものととてもよく似ていますが、ずっと強力です。 1行目にあるように、波括弧で囲むことで同じパッケージから複数のクラスをインポートできます。 また別の違いとして、パッケージやクラスのすべての名前をインポートするときは、アスタリスク * の代わりにアンダースコア文字 _ を使います。 というのもアスタリスクは、あとで見るように Scala の識別子(例えばメソッド名)として有効だからです。
それゆえ2行目のインポート文は、DateForat クラスのすべてのメンバーをインポートします。 これによって static メソッド getDateInstance や static フィールド LONG が直接利用可能になります。
main メソッドの中では、まず Java の Date クラスのインスタンスを作成します。 このインスタンスはデフォルトで現在の日時を含んでいます。 次に、先ほどインポートした static の getDateInstance メソッドを使って日付の書式を定義します。 最後に、ローカライズされた DateFormat インスタンスによって書式設定された現在の日付を表