2011-08-29 11 views

答えて

10

実行可能なコードブロックを意味します。例えばので

:この場合

scala> def doTwice(op: =>Unit) = {op; op} 
doTwice: (op: => Unit)Unit 

scala> doTwice({println("Hi")}) 
Hi 
Hi 

=>Unitはここ{println("Hi")}

"SomeType" であるprintln値を生成しないので、ユニットです。 Intが生成された場合は=>Intとなります。

+1

おっと、わかります。ありがとう!これは私がスカラについて嫌いなものです。それはこのようなGoogleの事にばかげて難しいです:)良い人とstackoverflowのための神に感謝:) – Arg

+4

良い例。ここで、 'op'は名前*パラメータ(*は値*ではなく)で呼び出されます。 'doTwice(println(" Hi "))'と書くことも同様にうまくいくことに注意してください。 Scalaで関数を呼び出すと、* name *または* value *でパラメータを渡すかどうかは構文によって示されません。 –

+2

@Arg [SymbolHound](http://symbolhound.com/)はあなたの友人です。 –

2

これは単なるパラメータを取らない関数値のタイプです。 オーウェンの例はクールで、ちょうど "A => B"はA型のパラメータとB型の戻り値を持つ関数であり、 "=> B"はパラメータを取らずに返しますタイプBの値。

6

2つのことを示します。まず、接頭辞=>のために、パラメータがby nameを渡すことを示します。次に、渡されたパラメータのタイプがSomeTypeである必要があることを示します。

=> SomeTypeはタイプそのものであると考えている人もいれば、2人を争う人もいます。これは、パラメータ評価戦略とパラメータ型という2つの要素の組み合わせです。だから、

、Wikipediaのリンクは、あなたがこの持っている場合は、物事を明確にしていない場合は名前で呼び上の簡単な説明、:

{ some stuff; some stuff } 

def f[A](x: => A) = { x; x } 
f(some stuff) 

を次にScalaは、次のようにこれを実行しますパラメータということも

val x = some stuff 
{ x; x } 

注:何が起こることより、このようなものです値によってコールで

は常にで評価されますが、値は1回だけです。名前による呼び出しでは、は決してと評価されます(たとえば、ifの非実行ブランチにある場合)。しかし、何度も評価される可能性があります。

+1

この場合、[A]は何を表していますか?私は数多くの場所でそれを見てきましたが、まだそれを得ていません。 –

+1

@elimence _typeパラメータ_です。これは、 'f'が宣言された時点では知られていないが、' f'が使用された時点では認識される型です。関数 'f'はすべての型' A'に対して有効です。この場合、 'A'が何であるかについての制限はありません。下位境界( 'A'は' SomeConcreteType'またはそれのサブタイプでなければなりません)、 'A :::SomeOtherType'(' A'は 'SomeOtherType'のスーパークラスでなければなりません)を示す' A <:SomeConcreteType' 'A'が何らかの暗黙的なパラメータの一部でなければならないことを示すだけでなく、' A'ができることに任意の制限をもたらします。 –

+0

Danielさん、ありがとう –

関連する問題