なんかJava使いをScalaに引き込むサンプル集っていうのが話題になってたから書いてみた。反省はしていない( `ー´)
べつに喧嘩したいわけじゃないっていうか、そもそもC#使いをScalaに引き込む必要ないし、誰得?ってことになるわけなのですが。
ただ、自分自身の話すると、まだ社会人2年目ですが、C#もscalaも仕事でそれなりに数ヶ月は経験してます。
scala知ってる人に、"C#できますか?"って聞いても、できる人がほとんどいなく、悲しい思いをすることが多いです。個人的には、scalaちゃんもC#たんもかわいい
@GrierVelsXX @xuwei_k フォローと応援、是非宜しくお願いいたします
↑なぜか話しかけられたw
とかではなく、まぁまぁC#も言語として好きなので、まぁちょっと自分なりに整理してみただけです
そもそも、
scalaのほうが後発なので、言語仕様が整理されててまとまってるのは当たり前
です。その点理解した上でみんな議論しましょう。
あと自分なりにまとめただけなので、間違ってるとこあるかもしれませんので、何かあればどんどん突っ込んでください。
あと、全然完璧ではないので、あとからちょこちょこ追記するかもしれません。
そして、個人的にscalaのほうが詳しいので、C#の記述がかなり中途半端になってる可能性が大ですが、これに刺激されて、だれかC#の良さについてscalaと比べて熱く語ってください。
scalaの方が有利(もしくは機能が豊富)だと思う点
ラムダ短く書ける
そのパラメータが1度しか使わない場合には、_ を使って、変数に名前つける必要ないってやつ
コレクションクラスの高階関数
これは、C#以外の言語と比べてもscala独自の特徴だと思われるんだが、他の言語そこまで詳しく知らないので・・・
MapをmapすればMapが返って来る
ListをmapすればListが返ってくる
ってやつ
C#だとDictionaryをSelectするとDictionaryが返るのか?ってことになるのかな
ただ、C#の場合、LINQとかうまく使えば大して困らない気がするが、知識不足のためよくわかりません、すいません
型
もうみずしまさんのこれ、
JavaとScalaとC#のジェネリクス機能比較表
見れば型まわりの、たいがいの事は書いてあるので・・・
結論を言えば、
の両方があります。
これの最後の方にでてくる
ジェネリックな型エイリアス
っていうのは、ゆろよろさんのもりそばを読みましょう。これはC#にはない、明らかにscalaが有利な点・・・だと思う
型推論がちょっとだけ高機能
C#の場合ローカル変数だけだけど、scalaはフィールドとかメソッドの戻り値も型省略可能・・・ってだけ。
まぁその辺は、scalaよりその他の関数型言語のほうが高機能ですが・・・
import文
- packageもimportできる
- 相対import
- ファイルの先頭以外でもどこでもimport文書ける
など、だいぶ高機能です
structural subtyping
まぁべつにたいしていらない気もするけど・・・
STM
なんか.NET用のSTM.NETっていうのが昔あったらしいけど、頓挫した(?)ってまえtwitter上で聞いた。
scalaも出来たばかりだし、まだ発展途上でどうなるかは、わからないが、2.9またはそれ以降に標準ライブラリとして入るって話
if式
if文自体が値を返す
まぁ機能としては、3項演算子っていえばそれまでなんですが、3項演算子だと、
- ? と : って1文字で読みにくい
- elseが2、3回続いた場合にif式のほうがわかりやすい
と個人的には思う
try catchも値返す
便利ですよ
implicit parameter
すごく使いこなせば、ものすごく高度な型の操作ができる。他人の記事の紹介で申し訳ないが、これとか*4
自分も理解できてないけど、
@okomokさんの このライブラリ とか
これとか
implicit conversion
拡張メソッドとか、できることは似てるけど違うよな・・・
これは、うまく比べて書くの難しい・・・
returnとかセミコロンとか余計なカッコ省略
まぁ慣れの問題っていえばそうですが。
個人的には、returnとかセミコロンとか省略できるのは地味に便利、というか好きです
C#のほうが有利だと思う点
unsignedとか、プリミティブ型が多い
decimalとかもあるし
拡張メソッド
implicitと似てなくもないが、なんか逆にわかりやすい拡張メソッドが個人的に割と好きだったりする。
構造体
一言でいうと、ヒープではなくスタックつかわれるっていう話。
構造体ってどのくらい使われてるの?
これが、JavaやScalaにないのはJVMの問題なのか?それとも単に、大して必要ないという判断か?
参照渡し(ref とか out)
おそらく、CやC++からのポインタや参照渡しの概念を受け継いだためにあると思うんだが・・・・
これって今になってみるとどうなの?どのくらい使われてるの?ただの過去の遺産?関数型と相性悪いよね?いやでも便利なときもありそうだけど自分は適切な使い方あまりわかってない