2016-10-02 6 views
0

LATER EDIT:スカラエラー:値<FUNCTION_NAME>は、オブジェクトのメンバではない<OBJECT_NAME>

  • 関連質問:の

Why are Scala class methods not first-class citizens?

Motivation for Scala underscore in terms of formal language theory and good style?

使用_ワイルドカード、またはプレースホルダの構文Scala placeholder syntax

  • この質問では、私はよりコンパクトな構文を達成しようとしていた、その溶液は、いわゆるプレースホルダの構文を関与しました。この視点は、ジェイソン・シュワルツのLearning Scalaに強化され、ページ74:

Placeholder syntax is especially helpful when working with data structures and collections. Many of the core sorting, filtering, and other data structure methods tend to use first-class functions, and placeholder syntax reduces the amount of extra code required to call these methods.


QUESTION本体

私は、一次関数のためのScalaのサポートを試して、this問題が発生していますパラメータとしてメソッドを渡すことについて。私が理解する限り、解決方法は(名前付きまたは匿名の)一次関数でメソッドをラップすることです。これは私のために働い:

def wrapperFn(s:String):String = s.reverse 

wrapperFnは現在、他の高階関数に、または値としてこのような他の定義にパラメータとして渡すことができます。

val otherGoodFn:(String=>String) = goodWrapperFn 

これまでのところは良いです。私は(sパラメータのやや冗長な使用を避けること)の両方の手順を混ぜ、直接このように、機能型指定された値にメソッドを渡すしようとしたときに問題が来た:

次のエラーがスローされます
def errorFn:(String=>String) = String.reverse 

:予想通り、これが動作するため、私は、理解していない

error: value reverse is not a member of object String 
    def errorFn:(String=>String) = String.reverse 
               ^

val s:String = "hello" 
s.reverse 

だから、明らかにこの方法は、インスタンスのメンバーではなく、オブジェのct/Class(??)Scalaは、Javaとは非常に異なる方法でクラスとオブジェクトの存続時間を処理するようです。だから今より簡潔に私の質問、:

  • はいくつかの愚かなミスによるエラーであるか、または許可されていないことは確かでしょうか?許可されていない場合、なぜですか?

ありがとうございます!

答えて

2

String.reverseは、静的メソッド(またはScalaの用語ではなくobjectのメソッド)を呼び出しています。

あなたはここにアンダースコアがあなたがそれらに名前を与えることなく、メソッド/関数のパラメータにアクセスすることができます

def errorWrapperFn:(String=>String) = _.reverse 

を行うことができます。

+0

すばらしい、ありがとう。 '_'ワイルドカードは '=>'トークンの前の型に直接マップされていると思いますか? –

+0

はい、名前のないパラメータの型は、ここでメソッドのシグネチャから推測されます。 – Thilo

+0

とここにどのように(とにかく私の投稿を編集)です:http://stackoverflow.com/questions/8260367/scala-placeholder-syntax –

関連する問題