A Day in the Life

2009-07-06

Scala でコマンドの実行結果を文字列として取得

もっとシンプルに書けたりするのかな…。

import scala.collection.immutable.PagedSeq;
import java.io.InputStreamReader;
import java.lang.Runtime;

def exec(str:String) = {
  val process =  Runtime.getRuntime.exec(str)
  PagedSeq.fromReader(new InputStreamReader(process.getInputStream)).toString
}

println(exec("uname -a"))
// => Linux paprika 2.6.30-1-686 #1 SMP Sun Jun 14 16:11:32 UTC 2009 i686 GNU/Linux

Scala の文字列操作 大文字小文字の入れ替え

// 本当は Case クラスで書きたいけどどうやるんだろ…
def swapchar(c:Char): Char = {
  if (c.isLowerCase)
    c.toUpperCase
  else if (c.isUpperCase)
    c.toLowerCase
  else
    c
}

def swapcase(self:String): String =
  if (self == null) null
  else if (self.length == 0) ""
  else {
    val chars = self.toCharArray
    new String(chars map swapchar _)
  }

println(swapcase("aBc DeF"))
//# => AbC dEf

Implicit Conversions で、String.swapcase だけ呼ばれたときだけ暗黙の関数呼び出ししたいんだけど、毎>回クラス定義しないとだめなのかなぁ。イメージ的には

implicit def strswapcase (s:String) = Class(s:String) {
  def swapcase: String = ...

みたいな、無名クラスというか...

Scala の文字列

とりあえずいろいろ覚書を。間違っていたら識者の方が指摘してくれるはず…!

文字列リテラル "string" は java.lang.String が返るが、Implicit Conversions によって、scala.runtime.RichString の関数へと変換されるべきものは変換され実行される。

"string".substring(3) //=> java.lang.substring が呼び出される
"string".reverse //=> 暗黙的に変換され scala.runtime.RichString.reverse が呼び出される

このへんの実装は scala.Predef に書いてある。

implicit def stringWrapper(x: String) = new runtime.RichString(x)
// RichString => String もある
implicit def richString2String(x: runtime.RichString): String = if (x eq null) null else x.toString

おもしろーい

X 立ち上げず VirtualBox の windows(ホスト) <-> Linux (ゲスト)間のクリップボード共有ってできるの!?

タイトルママ。教えて君です。

記事の一覧 >