2016-10-12 4 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 _ 
} 

оболочки Скала

import myproject.imports._ 

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

Любой способ сделать это или я должен поместить аргументы по умолчанию во внешнее определение функции?

+1

[Не совсем несвязанный] (http://stackoverflow.com/a/25235029/334519). –

ответ

1

функции (т.е. значения типа Function<N>[...]) просто не может иметь значение по умолчанию или неявные параметры в Scala, только методы могут. И method _ возвращает функцию: вот для чего это. Так что да, чтобы достичь своей цели, вы должны были бы написать

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

Вы можете избежать дублирования с помощью

object imports { 
    val x = myproject.somepackage 
} 

// elsewhere 
import myproject.imports._ 

x.internalAPIFunction() 

// or 
import myproject.imports.x._ 

internalAPIFunction() 

, которые могут или не могут быть достаточно для ваших целей.

+0

Я вижу, спасибо! Я надеялся избежать использования более чем одного оператора импорта, а также включить неявные методы, мне, возможно, придется реструктурировать, где функции определены ... – spiffman

-1

Я думаю, вам нужно использовать currying.

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

Смежные вопросы