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の事はさっぱり知らないので、設定で少し苦労しました。

1.projectディレクトリ作成

sbtアプリ内で下記コマンド実行

mkdir project/build

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上でも補完が効きます。