クラスをつくってみる。

なんかよくやったよねーこれみたいなPersonクラス。
package person

class Person(val name : String){
def hello = println("my name is " + name)
}



実行クラス。
package programmer

import person.Person

object ScalaPersons{
def main(args : Array[String]){
val person = new Person("マイコーりょう")
person.hello

println("直接きいてみると"+person.name)
}
}


Personクラスのコンストラクタで値いれてるnameって変数、定義してないけどスコープってどうなんだ?って思ったので直接参照してみてる。

結果は↓
my name is マイコーりょう
直接きいてみるとマイコーりょう

別パッケージのクラスから直接参照できてるのでpublic扱いってことかな。。
そもそもこの概念が通用するのか。

そして。。。ScalaなクラスはJavaから直接呼べると聞いて。
package programmer;

import person.Person;

public class JavaPersons {
public static void main(String[] args){
Person person = new Person("えがしら");
person.hello();
}
}


結果。

my name is えがしら


すげー(ノ´▽`)ノ

なんか完全に同居できそうな感じ。

あとScalaではPersonなクラスの変数宣言時に型は明示しなくてよい。
てかPerson#helloの書き方からしてなんかJSっぽい。
けど違うのは型推論がはいってるので、型が違うときはちゃんとコンパイルエラーにしてくれるってさ。
賢い。

ちなみにScalaを呼び出すJavaを実行するときはjavaコマンドではなくscalaコマンドで実行しる!とのこと。IDEつかってたら関係ないが。
そう。scalaコマンドは結局javaコマンドを呼び出してるだけらしい。

・・・まじっすか。
ってことでscalaコマンドの実行ファイルの中身を見てみる。
#!/bin/sh

##############################################################################
# Copyright 2002-2009, LAMP/EPFL
#
# This is free software; see the distribution for copying conditions.
# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
##############################################################################

cygwin=false;
case "`uname`" in
CYGWIN*) cygwin=true ;;
esac

# Finding the root folder for this Scala distribution
SOURCE=$0;
SCRIPT=`basename "$SOURCE"`;
while [ -h "$SOURCE" ]; do
SCRIPT=`basename "$SOURCE"`;
LOOKUP=`ls -ld "$SOURCE"`;
TARGET=`expr "$LOOKUP" : '.*-> \(.*\)$'`;
if expr "${TARGET:-.}/" : '/.*/$' > /dev/null; then
SOURCE=${TARGET:-.};
else
SOURCE=`dirname "$SOURCE"`/${TARGET:-.};
fi;
done;
SCALA_HOME=`dirname "$SOURCE"`/..;
SCALA_HOME=`cd "$SCALA_HOME"; pwd`;
# Remove spaces from SCALA_HOME on windows
if $cygwin; then
SCALA_HOME=`cygpath --windows --short-name "$SCALA_HOME"`
SCALA_HOME=`cygpath --unix "$SCALA_HOME"`
fi

# Constructing the extension classpath
TOOL_CLASSPATH=""
if [ -z "$TOOL_CLASSPATH" ] ; then
for ext in `ls -d "$SCALA_HOME"/lib/*` ; do
if [ -z "$TOOL_CLASSPATH" ] ; then
TOOL_CLASSPATH="$ext"
else
TOOL_CLASSPATH="$TOOL_CLASSPATH:$ext"
fi
done
fi

if $cygwin; then
if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then
format=mixed
else
format=windows
fi
SCALA_HOME=`cygpath --$format "$SCALA_HOME"`
TOOL_CLASSPATH=`cygpath --path --$format "$TOOL_CLASSPATH"`
fi

# Reminder: substitution ${JAVA_OPTS:=-Xmx256M -Xms16M} DO NOT work on Solaris
[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx256M -Xms32M"

if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then
JAVACMD="$JAVA_HOME/bin/java"
fi

exec "${JAVACMD:=java}" $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS" scala.tools.nsc.MainGenericRunner "$@"



ほんとやーー( ̄□ ̄;)