豆ナイト

に行ってきた。
30名近くはいたかと思われる参加者がいて、
思ったよりもずっと多くの方々が
Scalaに興味を持っているのだと知りました。

で、帰ってきて、いくつか疑問点を、例によって
LingrScala-jaでmizushimaさんにレクチャーしてもらう。

Q:caseを付けてクラスを宣言すると、newがいらなくなりますよね

これって、もしかして、自動的に同名のobjectが定義されて
そこにapplyがあったりするのでしょうか

A:実は、それは違うようです

ただ、2.6と2.7では若干挙動が異なります。
例えば、

case class Point(x:Int, y:Int)

としたうえでPointを評価すると
2.6だとエラー。2.7だと Point.type = <function>
となって2.7では同名のobjectにapplyを定義した場合の振る舞いと
似たようになっている。

Q:1引数の関数呼び出し時は()が省略できますが、

println "hoge"などいくつかの場面では
怒られるのはなぜなんでしょう・・・?

A:そのルールは、意外と単純で、レシーバを指定しない関数呼び出しでは、

1引数以上の関数呼び出しで括弧が省略できないわけです

Q:class Person(na:String, ag:int)とした場合、

naとagはデフォルトでpublicとの話をされていましたが、

val pson = new Person("hoge", 20)

として

println(p.na)

はエラーですよね?

A:ええ

valもしくはvarが必要です。

class Person(val na:String, val ag:Int)
class Person(protected val na:String, ...)

のようにアクセス修飾子も指定できます