2016-10-02 2 views
0

ПОЗЖЕ EDIT:Скала ошибка: значение <FUNCTION_NAME> не является членом объекта <OBJECT_NAME>

  • Связанные вопросы:

Why are Scala class methods not first-class citizens?

Motivation for Scala underscore in terms of formal language theory and good style?

Использование из _ подстановочный знак, или заполнитель синтаксис: Scala placeholder syntax

  • В этом вопросе я пытался достичь более компактного синтаксиса, и решение участвует так называемый заполнитель синтаксиса. Эта точка зрения подкрепляется в Джейсон Шварц-х Learning Scala, страница 74:

Placeholder syntax is especially helpful when working with data structures and collections. Many of the core sorting, filtering, and other data structure methods tend to use first-class functions, and placeholder syntax reduces the amount of extra code required to call these methods.


ВОПРОС ТЕЛА

Я пробуя поддержку Scala для функций первого порядка, и столкнулся this проблемы, о методах передачи в качестве параметров. Насколько я понял, решение состоит в том, чтобы обернуть метод с помощью функции (илименованного или анонимного) первого порядка. Это работает для меня:

def wrapperFn(s:String):String = s.reverse 

wrapperFn теперь можно в качестве параметра для других функций высшего порядка, или в качестве значения для других определений, как этот:

val otherGoodFn:(String=>String) = goodWrapperFn 

До сих пор так хорошо. Проблема возникла, когда я попытался смешать оба шага (избегающий в нескольких многословном использовании параметра s), и непосредственно передать метод функции типизированного значения, как это:

def errorFn:(String=>String) = String.reverse 

Который выдает следующее сообщение об ошибке:

error: value reverse is not a member of object String 
    def errorFn:(String=>String) = String.reverse 
               ^

Что я не понимаю, потому что это работает, как ожидалось:

val s:String = "hello" 
s.reverse 

Таким образом, очевидно метод является членом экземпляра, но не из OBJE ct/Class (??) Кажется, что Scala обрабатывает время жизни класса и объекта по-разному, как это делает Java. Поэтому мой вопрос, теперь более кратко:

  • Является ошибкой, вызванной какой-то глупой ошибкой или это действительно не разрешено? А если не разрешено, то почему?

Заранее благодарим!

ответ

2

String.reverse будет вызывать статический метод (или метод на object вместо класса в терминах Scala).

Вы можете сделать

def errorWrapperFn:(String=>String) = _.reverse 

Подчеркивание здесь позволяет получить доступ к параметрам метода/функции без необходимости дать им имя.

+0

большой, спасибо. Я предполагаю, что подстановочный знак '_' напрямую сопоставляется типу перед токеном' => '? –

+0

Да, тип неименованных параметров выводится из подписи метода здесь. – Thilo

+0

и вот как (я редактировал мой пост в любом случае): http://stackoverflow.com/questions/8260367/scala-placeholder-syntax –

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