豆ナイト
に行ってきた。
30名近くはいたかと思われる参加者がいて、
思ったよりもずっと多くの方々が
Scalaに興味を持っているのだと知りました。
で、帰ってきて、いくつか疑問点を、例によって
LingrのScala-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, ...)
のようにアクセス修飾子も指定できます