Странное определение и вызов функции с фигурной скобкой в ​​Scala (функция как параметр функции) - PullRequest
3 голосов
/ 29 мая 2020

Я совершенно новичок в Scala, мне нужно поддерживать старый код, поэтому я должен понимать, что он делает.
Теперь я застрял на этом фрагменте кода, он об определении и вызове метода.

Это определение метода:

private def myMethod[I, O](price: Long, id: Int)(i: I)(f: (I, String) => O): O = {
      ..some code..
}

это вызов метода

myMethod(price, id)(b) {
      ..some code.. //single line of code, just calling an other function 
}

Я понял, что часть параметра типа также связана с наличием нескольких параметров (каррирование).
Но чего я не понял, так это:

  • в первую очередь эта часть: (f: (I, String) => O), это для меня совершенно странно
  • во-вторых, почему в методе вызов, он содержит код после символа {, заменяет ли он исходный метод? даже в этом случае нет смысла переопределять его при вызове
  • также, myMethod должен возвращать значение типа O, но в моем коде это никогда не влияет на какую-либо переменную. ( РЕДАКТИРОВАТЬ: теперь этот момент ясен, я просто неправильно понял код, nvm не возражает )

Кто-нибудь может прояснить эти моменты (особенно первый и второй, которые меня так сбивают с толку)


EDIT

private var x : classX

myMethod(price, id)(b) {
      x.listX //calling method without parameters
}

def listX (param1: ListFaFBI, param2: String): ListX ={
  //returning an Object of type ListX, not a function
}

как вы можете видеть, что myMethod звонит listX. если я хорошо понял, myMethod возвращает сам метод listX, который имеет два параметра ListFaFBI (или I) и String, и возвращает ListX (или O), как определено в (f: (I, String) => O)

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

прежде всего эта часть: (f: (I, String) => O), это для меня совершенно странно

Это функция, беря кортеж из двух элементов типа I и String, и возвращает O

, почему в вызове метода он содержит код после символа {, переопределяет ли он исходный метод?

В вашем методе используется список с несколькими параметрами, а синтаксис последней группы параметров представляет собой определение блока, которое позволяет определить значение функции ((I, String) => O)

Например , если бы у нас был метод, который принимает функцию в том же списке параметров:

def foo(s: String, f: String => String)

Наша реализация выглядела бы так:

foo("hello", {
    s => s + "world"
  }
)

Однако, если бы мы использовали отдельную группу параметров :

def foo(s: String)(f: String => String)

Наша реализация выглядит так:

foo("hello") {
   s => s + "world"
}

Что приятнее для глаз и лучше читается.

myMethod должен возвращать значение типа O, но в моем коде это никогда не затрагивало никакую переменную

Если вы добавите реализацию метода, мы сможем лучше показать вам, где он возвращает значение типа O

3 голосов
/ 29 мая 2020
  1. f - это функция, которая принимает I и String и возвращает O. f: (I, String) => O - это синтаксис c сахар для f: Function2[I, String, O].

  2. Фигурные скобки действуют, по сути, так же, как круглые скобки, хотя есть некоторые отличия, так как их можно рассматривать как блоки (см. этот вопрос ). Код внутри фигурных скобок на самом деле является функциональным литералом и передается как f. Также см. Этот вопрос . Здесь

myMethod(price, id)(b) { (i, s) =>
      ..some code.. 
}

будет синтаксисом c сахар для

myMethod(price, id)(b)({ (i, s) =>
      ..some code.. 
})
Я не уверен, что вы имеете в виду, говоря «в моем коде это никогда не затрагивалось ни одной переменной», но я предполагаю, что то, что возвращается, либо не имеет отношения к делу, либо подразумевается возврат (в случае вызова myMethod находится в конце блока.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...