Scala - использовать переданную функцию с параметром _ - PullRequest
0 голосов
/ 16 февраля 2012

Если у меня есть следующий код:

val wows = Buffer[Wow]()

def yo(f: _ => Wow) { wows += f }

и я получаю ошибку при попытке добавить f. Интересно, как я могу использовать f внутри тела метода, или, точнее, как я должен ссылаться на него, так как f или f() или f(_) не работают.

UPDATE:

Тип f нельзя изменить на f: => Wow, поскольку функции типа _ => Wow, переданные этому методу, происходят из такого класса:

object Wonderful {

    val wows = Buffer[Wow]()

    def yo(f: _ => Wow) { wows += f }
}

class Joy[+R](fs: Buffer[_ => R]) {

    def exalt() {
        fs.map(Wonderful.yo(_))
    }
}

и этот буфер не может быть параметризован с помощью => R, он показывает ошибку.

ОБНОВЛЕНИЕ 2: Вы оба ответили вторым, прежде чем я закончил объяснение второй части! Спасибо! Это скорость!

ОБНОВЛЕНИЕ 3: По сути, я изучаю Scala и пытаюсь опробовать все, что могу придумать. В этом конкретном фрагменте кода происходит следующее: у меня есть 3 основных класса:

  • WorldObject - представляет все игровые объекты (имеет x, y и т. Д.).
  • Emitter - представляет что-то, что испускает объекты с течением времени (расширяет WorldObject).
  • Funset - набор функций, которые должны вызывать WorldObjects при вызове. В будущем я хотел сделать их частично примененными функциями с некоторыми подготовленными аргументами, передаваемыми непосредственно соответствующим фабричным методам.
  • Мир - где все происходит.

Суть в том, что коллекция «порождающих» функций Funset может быть отредактирована во время выполнения, поэтому она представлена ​​в виде буфера. В каждом цикле обновления Эмиттер передает каждую из функций Funsets функциям создателя Мира, которые проявляют созданные объекты в мире.

Надеюсь, я объяснил, чтобы это можно было понять ... может быть, немного странно или неправильно, но ... в любом случае, я кое-что узнал о Scala сейчас!

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Это параметр по имени, который вы ищете?Если это так, ваш синтаксис немного не работает.Вот правильный путь:

scala> class Wow
defined class Wow

scala> val wows = collection.mutable.Buffer.empty[Wow]
wows: scala.collection.mutable.Buffer[Wow] = ArrayBuffer()

scala> def yo(f: => Wow) { wows += f }
yo: (f: => Wow)Unit
2 голосов
/ 16 февраля 2012

_ => Wow - это метод, который принимает один аргумент типа, который вы не знаете, и возвращает Wow.Вы не сможете вызвать его, так как не знаете, с каким аргументом вызывать его!

Я подозреваю, что вам нужен метод без аргументов, который вы могли бы сделать следующим образом:

def yo( f: () => Wow ) { wows += f() }

Также вы можете сделать параметр по имени , который немного более неявный:

def you( f: => Wow ) { wows += f }

Редактировать: разница в том, как вы его называете;параметр by-name просто оценивает выражение, когда оно используется.Передача функции - это просто передача функции, которую вы можете вызвать по желанию.

...