2016-11-03 7 views
0

これは比較的新しいスカラー関数であり、この構文砂糖が実際にどのように実際に働くのか、いつ特定の型を使うのか混乱してしまいます。スカラー:引数のない関数

私は3つの機能と同じことを行うべきすべてを書かれているが、私はFunction0が異なっ

バージョン1

val fn1 : (String) => String = System.getProperty(_) 

println(fn1("os.name")); 

バージョン2

val fn2 :() => String = System.getProperty("os.name") 

    println(fn2()); 
を動作している理由を理解することの問題を抱えています

バージョン2は型の不一致を示します。見つかりました:必要な文字列:()文字列に⇒

バージョン3私はバージョン2 ScalaはすでにはSystem.getPropertyの戻り値の型を知っているが、なぜそれがその特定のエラーが発生しないため、なぜそれをしないことを理解し

val fn3 =() => System.getProperty("os.name") 

println(fn3()); 

明示的に戻り値の型を記述しないようにしてください。私は個人的には明示的な戻り値の型を好むので、返り値が何であるかを調べるメソッドに没頭する必要はありません。

答えて

4

val fn2 :() => String = System.getProperty("os.name")では、System.getProperty("os.name")が実行され、文字列値が返されます。しかし、fn2は値であり、引数をとらず文字列を返す関数であると言っています。

System.getProperty(_)を実行すると、x => System.getProperty(x)のようになります。これは文字列を受け取り文字列を返す関数です。それが最初のバージョンが機能する理由です。

+0

ごめんなさいこれに対して、2番目の関数が "値、引数をとらず文字列を返す関数"と解釈された場合の応答です。同様の方法で最初の関数を読み込まない、つまり文字列をとり、文字列を返す関数を返しますか?代わりに、コンパイラは関数ではなく文字列を返すことに気づきます。 – Asrar

1

このバージョンでは、です。TypeCheckます:ここfn2()を呼び出す

val fn2 :() => String =() => System.getProperty("os.name") 

だけ呼び出すようにします

def fn2(): String = System.getProperty("os.name") 
fn2() 

をごfn1例では、アンダースコアは、より多くのように見えた、この暗黙の構文を提供していますempty-argsの場合に必要なもの:

val fn1 : (String) => (String) = (s) => System.getProperty(s) 
+0

'def'sはファーストクラスのオブジェクトではなく、FunctionNとは逆のメソッドです。だから 'val fn2:()=> String'は' def fn2():String'とまったく同じものではありません。 – pedrofurla

+0

明確にするために私の答えを編集しました。 OPの例では、私が書いた2つのモデルは同等です。 'def'sをオブジェクトとして渡すことはできませんが、この比較は依然として役に立つと思います。 – Tim

関連する問題