2017-05-23 7 views
2

私はコードを書く途中ですので、私は呼び出していないメソッドを残そうとしていましたが、そのパスフローは入力に基づいていません私は提供しています。この方法は、このスカラのアンダースコア(_)と疑問符(???)の相違

object HbaseStore { 
    def get() = _ 
} 

のように見えます。しかし、上記のコードは、例外

HbaseStore.scala:24: error: unbound placeholder parameter

[INFO] def get() = _

を投げた。しかし、私は???コードで_を交換したときに正常に実行されました。私はちょうどこれらの2つの違いは何かを知りたいのです。私が知る限り、_はデフォルト値を提供するので、ここでは空の関数を定義し、Nothingを返します。

+3

Scalaのアンダースコア「_」はデフォルト値を提供しません**。実際には多くの用途や意味がありますが、そのいくつかは[ここ](https://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala)にあります。 。 – jwvh

答えて

3

_は、値をバインドするために使用されるプレースホルダ構文です。プレースホルダの構文は、例えば、多くのシナリオで使用されます。 をリストする場合:

val x = List(1,2,3,4,5) 
//To print each value we can do: 
x.map(res => println(res)) 
//Now, we can use placeholder syntax to bind res value. 
x.map(println(_)) 

パターンマッチング:あなたはせずに値を持つようにしたい場合は

val x = "some value" 
x match { 
case x:String => //convert to lowercase and print. 
case [email protected]_ => //here, type doesnot matter I just want to get that value and print as it is. println(res) 

だから、基本的には、プレースホルダの構文を使用しますそのタイプを知っている。

一方、実装を提供したくない場合は、???が値としてメソッドまたは変数に割り当てられます。

def doSomething() => ??? ここではdoSomething()メソッドが実装されていないため、後で実装を提供するかオーバーライドする必要があります。ただし、実装なしでは変数/メソッドを使用することはできず、呼び出すときに例外が発生することに注意してください。例えばdoSomething()は上記の場合に失敗します。

+0

ありがとう@ラKa。あなたの答えを評価しました – sachinjain024

+1

@ sachinjain024 '???'は実際には '_'のような特殊な構文ではないことに注意してください。 '???'は 'scala.predef'で定義された単なるメソッドです – puhlen

2

_をデフォルト値として使用する場合は、この値のタイプを指定する必要があります。たとえば、var x: Any = _nullで初期化されますが、var x: Int = _0で初期化されます。 ???について : あなたはIDEで???の定義をクリックすることができます:Nothing以来

def ??? : Nothing = throw new NotImplementedError

は、任意の型のサブタイプである、それが動作します。