ScalaのListでインデックス付きの操作を行いたい場合
zipWithIndexを使う。
タプルに値とインデックスが入る。
val l = List("A", "B", "C") for(e <- l.zipWithIndex) yield e._2 + " : " + e._1
すると、List[java.lang.String] = List(0 : A, 1 : B, 2 : C)みたいになる。
■追記
コメントいただきました。パターンマッチを使って、こう書けるそうです。
for((i, x) <- l.zipWithIndex) yield (i + " : " + x)
こっちの方がずっとかっこいいですね!
foreach使うならこんな感じで。
l.zipWithIndex.foreach{case (x, i) => println(i + ":" + x)}
sbtでcommons-netのライブラリをダウンロードする
scalaアプリケーションでFTP操作をしたくなったので、
sbtでCommons Netを落とすための方法を調べてみました。
自分でjarをダウンロードしてlibディレクトリに入れればいいのですが、
mavenレポジトリからダウンロードも可能なので、そっちで試してみました。
しかし自分、mavenの事はさっぱり知らないので、設定で少し苦労しました。
2.作ったディレクトリ内にMyProject.scalaファイル作成し、以下を記述。
変数名はなんでもいいようです。
import sbt._ class MyProject(info: ProjectInfo) extends DefaultProject(info) { val commonseNet = "commons-net" % "commons-net" % "2.2" }
3.sbtを実行し、reload、updateを実行
updateすると、jarがダウンロードされます。
sbt起動中にMyProject.scalaを修正した場合は、先にreloadを行っておきましょう。
jarはlib_managed配下に入っています。
$ sbt [info] Recompiling project definition... [info] Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed. [info] Building project sandbox 1.0 against Scala 2.8.1 [info] using MyProject with sbt 0.7.4 and Scala 2.7.7 > update [info] [info] == update == [info] downloading http://repo1.maven.org/maven2/commons-net/commons-net/2.2/commons-net-2.2.jar ... [info] [SUCCESSFUL ] commons-net#commons-net;2.2!commons-net.jar (23010ms) [info] :: retrieving :: net.coneco#sandbox_2.8.1 [sync] [info] confs: [compile, runtime, test, provided, system, optional, sources, javadoc] [info] 1 artifacts copied, 0 already retrieved (207kB/26ms) [info] == update == [success] Successful.
手順としてはこれだけなのですが、MyProject.scalaに書く内容でしばらく悩みました。
このURL↓
http://repo1.maven.org/maven2/commons-net/commons-net/2.2/
を見て、maven2の後の内容を書いたらうまくいきましたが、かなり当てずっぽうです。
mavenを知っていればすぐ分かるものなんでしょうかね・・・。
sbt(simple-build-tool)でのScalaバージョンの変更方法
2.8.0.RC3で作成していたアプリを2.8.0に変えたくなったので、
sbtでバージョンを変える方法を調査。
まあ、ここ(http://code.google.com/p/simple-build-tool/wiki/Loader)に書いてるけど、
一応メモ。
$ sbt > ++ 2.8.0 > set build.scala.versions 2.8.0 > reload > current Current project is ScalaApps 1.0 Current Scala version is 2.8.0 Current log level is info Stack traces are enabled
Scalaとsbtでandroidを開発する場合の.ensimeのサンプル
androidアプリをScalaで開発しています。
Eclipseは使わず、sbt(http://code.google.com/p/simple-build-tool/)と
android-plugin(http://github.com/jberkel/android-plugin)を使って、
emacs上で開発しています。
さらに、ensime(http://github.com/aemoncannon/ensime)という補完やリファクタリング機能を備えた
ツールを使っているのですが、これがまた開発が頻繁で、設定ファイルの書き方が変わるので、
今のバージョンごとの設定ファイルを残していってみます。
ちょっと注意する点としては、android-pluginで使用できるTyped resources referencesを
補完させるために、:sourcesで"src_managed/main/scala"を設定している辺りでしょうか。
Typed resources referencesに関しては、こちらの記事が素晴らしいです。
sbt-android-pluginで型安全にリソース取得(http://d.hatena.ne.jp/papamitra/20100719)
ensime0.2.4での定義ファイル(.ensime)
( :server-root "/home/sudix/opt/ensime" :server-cmd "bin/server.sh" :server-host "localhost" :use-sbt t :project-package ("com.example.androidapps") :compile-jars ("/home/sudix/opt/android-sdk-linux_86/platforms/android-4/") :sources ("src/main/scala" "src_managed/main/scala" "project/plugins/src_managed/sbt-android-plugin-0.5.0") )
これで、以下みたいな感じに、emacs上でも補完が効きます。