2011-07-07 2 views
5

は、私はこのような何かをしたい:これは明らかにように動作しませんScala:リテラル参照自体はできますか?

scala> "Hello world"(this.length -1) 
res30: Char = d 

私は最初のvalとしてそれを保存せずに「Hello World」を参照することはできません。

これを実現する方法はありますか?

+2

あなたは 'l'ではなく 'd'を作りたいですか?申し訳ありませんが、確かに.... –

+0

@レイ、私はタイプミスを修正しました。 – Rahul

答えて

22

あなただけの文字列の最後の文字が必要な場合行う、あなただけのことができます。一般的な問題については

scala> "Hello World".last 
res0: Char = d 

を、あなたは以下に示すように、前方のパイプ演算子を使用することがありますが:

scala> "Hello World" |> { t => t(t.length - 1) } 
res1: Char = d 

以下のように順パイプ演算子を定義するか、Scalazで使用できるパイプ演算子を使用します。

scala> implicit def anyWithPipe[A](a: A) = new { 
    | def |>[B](f: A => B): B = f(a) 
    | } 
anyWithPipe: [A](a: A)java.lang.Object{def |>[B](f: (A) => B): B} 
+0

[Scalaz](http://code.google.com/p/scalaz/)は、 '|>'順パイプ演算子を含む、 "型クラスと純関数データ構造"を提供するライブラリです。 [Google Codeのドキュメントとダウンロード](http://code.google.com/p/scalaz/)、[GitHubのソースコード](https://github.com/scalaz/scalaz) –

+0

@ RoryO'Kane、あなたがよく見れば、あなたは私の答えでScalazを言及することに気付くでしょう。 – missingfaktor

+0

私は知っています。私はScalazへのリンクとScalazの説明を提供していたので、他の人にはGoogleのようにする必要はありませんでした。 Scalazにスキマーのために '|>'が含まれていることを繰り返しました。 –

3

リテラル自体は参照できませんが、そのブロックにローカルな一時変数を使用してブロックを作成することはできます。

scala> val lastChar = { val tmp = "Hello World"; tmp(tmp.length - 1) } 
lastChar: Char = d 

scala> tmp 
<console>:8: error: not found: value tmp 
関連する問題