Hatena::Groupsubtech

#生存戦略 、それは

-> 09 { 07 / 06 }

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

23:50 | はてなブックマーク - 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 の文字列操作 大文字小文字の入れ替え

23:15 | はてなブックマーク - 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 の文字列

23:12 | はてなブックマーク - 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

おもしろーい

kmizushimakmizushima2009/07/07 23:03> Implicit Conversions で、String.swapcase だけ呼ばれたときだけ暗黙の関数呼び出ししたい

こんな感じで良いのではないかと。

implicit def strswapcase(self: String) = new {
def swapcase: String =
if (self == null) null
else if (self.length == 0) ""
else {
val chars = self.toCharArray
new String(chars map swapchar _)
}
private def swapchar(c:Char): Char = {
if (c.isLowerCase)
c.toUpperCase
else if (c.isUpperCase)
c.toLowerCase
else
c
}
}

secondlifesecondlife2009/07/07 23:34なるほど、new {} で無名クラスのインスタンス ( というのかな? ) を作成できるんですね。
ありがとうございます!

uskatenauskatena2011/06/29 10:26とおりすがったので、、、

scala> val msg = "asdfghjkl"
msg: java.lang.String = asdfghjkl

scala> msg.map(c => c.toUpper)
res0: String = ASDFGHJKL

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20090706