2017-05-08 9 views
2

で関数を使用してインスタンスを地図方法を供給することにより、インスタンスを変換するためのScalaでの方法はあります私はScalaの

def withExclamation(string: String) = string + "!" 

ローカルメソッド/機能を持っていると言いますか?文字列に感嘆符を追加したいとします。私は、インスタンス上のチェーン変換を書くときに(ローカル)関数を呼び出すことができるようにしたいと思い

val greeting = "Hello" 
val loudGreeting = greeting.applyFunction(withExclamation) //result: "Hello!" 

:ような何か。

編集:複数回答はこの可能性をプログラムする方法を示しているため、この機能は仲裁判断クラスには存在しないようです。私にとっては、この機能は非常に強力です。 Javaで私は文字列に操作の数を実行する場所を考えてみましょう:

appendExclamationMark(" Hello! ".trim().toUpperCase()); //"HELLO!" 

操作の順序は、彼らが読んでどのように同じではありません。最後の操作であるappendExclamationMarkが最初に表示されます。現在、Javaで私は時々だろう:

インスタンスで操作の鎖を発現するという点で優れて読み込み、だけでなく、多くのノイズが含まれており、でStringインスタンスを持つことが直感的ではありません
Function.<String>identity() 
    .andThen(String::trim) 
    .andThen(String::toUpperCase) 
    .andThen(this::appendExclamationMark) 
    .apply(" Hello "); //"HELLO!" 

最後の行私が書きたいでしょう:

" Hello " 
    .applyFunction(String::trim) 
    .applyFunction(String::toUpperCase) 
    .applyFunction(this::withExclamation); //"HELLO!" 

明らかapplyFunction関数の名前が(してください短い)何もすることができます。私は後方互換性がJavaのObjectにこれを持たない唯一の理由だと思った。 Any、AnyRefクラスに追加されていない技術的な理由はありますか?

+0

'someInstance'とは何ですか?あなたは '変形する'が何をすると思いますか? 'toString'を呼び出しますか? –

+0

修正済み:someInstanceはgreetingという名前にする必要があります –

答えて

5

あなたがあなた自身の方法で既存の型を拡張する方法を提供しimplicit classでこれを行うことができます。

object StringOps { 
    implicit class RichString(val s: String) extends AnyVal { 
    def withExclamation: String = s"$s!" 
    } 

    def main(args: Array[String]): Unit = { 
    val m = "hello" 
    println(m.withExclamation) 
    } 
} 

収量:

hello! 
1

をあなたがどんな機能を適用する場合(匿名で、メソッドから変換されたものなど)をこのようにして、Yuval Itzchakovの答えにバリエーションを使用できます。

object Combinators { 
    implicit class Combinators[A](val x: A) { 
    def applyFunction[B](f: A => B) = f(x) 
    } 
}