8月 202013
<< Rubyでメールを送る || 腱鞘炎になったけど3日で治した >>
Scalaを勉強した結果、今日のNode.js初級入門勉強会でcoffee-scriptが書けるようになってた。coffee気持ち悪いと思ってたけど苦手克服できてよかった。
Java/JRuby/Scala
ScalaはJava。JRubyはRuby。ScalaはJavaのシンタックスをシンプルに直して、Java使ってて不満な文字列、正規表現、配列やMap、無名関数や高階関数などの機能を追加した、より良いJavaという印象。
JRubyはRubyがJVM上で動いていて、ついでにJavaの機能も使える言語だと思う。
JRubyと比べると、JRubyよりもJavaに寄っている気がする。Javaのライブラリをスクリプト言語から使いたい時は今後はscala使おうと思う。
Scalaは型宣言をしなければならないのが良い。JRubyの方がRubyに寄っていて、スクリプト言語としての使い勝手はRubyの方が良いと思うけど、型がRubyの型なのかJavaの型なのかよくわからなくなって辛かった。
もちろんJVM上でRailsアプリを書くみたいな、Javaの機能は使わないでRubyだけでやるならJRubyは問題ないと思う。
スクリプト言語としての書き心地はRubyの方が好みだけど、スクリプト言語からJavaを使いたいならScalaの方がいい。
インストール
brew install scala
scala -version
scalaコマンドでインタラクティブシェルが起動して、適当に書いてtabを押せばメソッド名一覧とかでてくる。
おかげで特に本とか読まずにいきなりコード書ける。
練習問題
研究室のwikiにスクリプト言語の便利な機能を使わざるを得ないRubyの初級問題集がある。“abracadabra” などに “a” がいくつあるか数える
正規表現を使う。String.rでRegexpになる。メソッドチェインでつないでいける。: の後ろが型。
「また大阪か」を「ま た 大 阪 か」に変換する
いったん文字列を配列に分解してから結合し直すreturn書かなくてもいい。
フィボナッチ数列をどんどん生成する
無名関数をコールバック関数として登録するようにした。defじゃなくてvalに関数オブジェクトを保存するようにしてみた。valは定数でvarは再代入可能な変数。
普通のArrayは中身をいじれないので、mutable.ListBufferかmutalbe.ArrayBufferを使う。
配列の添字が[]ではなく()だった。Unitはvoidの事。
BigIntを使ったら9223372036854775807桁まで数値計算できた。
最大公約数を求める
可変長引数を使って、引数を何個でも取れるようにした。<-はrange。大きい数から試行したくてRange.reverseしてみたらちゃんと動いてくれてうれしかった。
Arrayにminやmaxといったメソッドがあって楽だった。
map,filter,forallなんかも良い。
fizzbuzz
scalaは型が固いのがいいのだけど、文字列と数値どちらも渡せる関数を作りたい時もある。Any型を使えばどんな型でも渡せる。
「ゎたしはっらぃょ」のように、小さい平仮名に変換しろ
argvで実行時引数が取れる。Mapも機能が豊富で使いやすかった。三項演算子はないけどif elseで同じ事ができる。
素因数分解
末尾再帰の結果をlistで巻き戻して返す。Scalaコレクションメソッドメモ(Hishidama's Scala collection method Memo)を見たら、四則演算子でlist同士を連結したり色々と操作する機能が充実してた。