2016-10-12 9 views
0

未適用メソッドを使用して関数を割り当てると、名前付きパラメータとデフォルトパラメータが失われているように見えます。これを避ける方法はありますか?関数の割り当て時に名前付きパラメータとデフォルトパラメータを保持する

def foo(namedParam: String = "defaultValue") = namedParam*2 
// scala> foo() 
// res8: String = defaultValuedefaultValue 

def bar = foo _ 
// scala> bar() 
// <console>:28: error: not enough arguments for method 
//    apply: (v1: String)String in trait Function1. 
//    Unspecified value parameter v1. 

私はこれをしたい理由は、単一のファイルで私の輸入をバンドルすることで、すなわち

でmyproject/imports.scala

object imports { 
    def externalAPIFunction = myproject.somepackage.internalFunction _ 
} 

Scalaのシェル

import myproject.imports._ 

externalAPIFunction() // no named or default arguments :(

これを行う方法は何ですか?あるいは、私のデフォルト引数を外部関数定義に入れなければなりませんか?

+1

[完全に無関係](http://stackoverflow.com/a/25235029/334519)。 –

答えて

1

関数(タイプFunction<N>[...]のすなわち値)は、単に、Scalaでデフォルトまたは暗黙的なパラメータを持つことができない唯一の方法ができます。 method _は関数を返します。それがそのための関数です。そうです、あなたの目的を達成するために、あなたはあなたがまたはあなたの目的には十分であってもなくてもよい

object imports { 
    val x = myproject.somepackage 
} 

// elsewhere 
import myproject.imports._ 

x.internalAPIFunction() 

// or 
import myproject.imports.x._ 

internalAPIFunction() 

使用して重複を避けることができ

object imports { 
    def externalAPIFunction(namedParam: String = "defaultValue") = 
    myproject.somepackage.internalFunction(namedParam) 
} 

を記述する必要があると思います。

+0

ありがとう!私は複数のimport文を使う必要がなく、また暗黙的なメソッドを含めることを避けることを望んでいました。関数が定義されている場所を再構成する必要があります... – spiffman

-1

私はカレーを使用する必要があると思います。

def foo()(namedParam: String = "defaultValue") = namedParam * 2 
                //> foo:()(namedParam: String)String 
    // scala> foo() 
    // res8: String = defaultValuedefaultValue 

    def bar() = foo() _        //> bar:()String => String 
    bar()           //> res0: String => String = <function1> 
+0

'bar()'はまだ動作しません... – spiffman

+0

私は自分の答えを更新しました。 – nikhil

+0

これは関数を返しますが、その関数を呼び出そうとすると 'bar()()'と同じエラーが発生します... – spiffman

関連する問題