Я только что начал Scala и занимаюсь рабочими листами. Например:Почему методы класса Скала не являются первоклассными гражданами?
def merp(str: String) : String = s"Merrrrrrrp $str"
val merp2 = (str: String) => s"Merrrrrrrp $str"
val merp3 = (str: String) => merp(str)
val merp4 = merp _
merp("rjkghleghe")
merp4("rjkghleghe")
и соответствующие результаты рабочего листа:
merp: merp[](val str: String) => String
merp2: String => String = <function1>
merp3: String => String = <function1>
merp4: String => String = <function1>
res0: String = Merrrrrrrp rjkghleghe
res1: String = Merrrrrrrp rjkghleghe
Говоря, например, val merp5 = merp
выдает ошибку, потому что по-видимому методы не могут быть значения как функции могут. Но я все еще могу передавать методы в качестве аргументов. Я демонстрирую это в следующем фрагменте кода, адаптировано из a similar SO question: результат
def intCombiner(a: Int, b: Int) : String = s"herrrrrrp $a derrrrrrp $b"
def etaAbstractor[A, B](combineFoo: (A, B) ⇒ String, a: A, b: B) = combineFoo(a, b)
etaAbstractor(intCombiner, 15, 16)
лист:
intCombiner: intCombiner[](val a: Int,val b: Int) => String
etaAbstractor: etaAbstractor[A,B](val combineFoo: (A, B) => String,val a: A,val b: B) => String
res10: String = herrrrrrp 15 derrrrrrp 16
- Есть методы, не-бытие первого класса ограничение, может быть наложен путем взаимодействия JVM Scala или это решение в дизайне языка?
- Зачем мне скатывать свой собственный eta abstractions, как в ?
- Есть
merp4
также eta abstraction, или это что-то скрытно похоже? - Почему мой
etaAbstractor
работает? Скала спокойно заменяетintCombiner
intCombiner _
?
Теоретические ответы на компьютерные науки приветствуются, как и указатели на любые соответствующие точки в language specification. Благодаря!
Разработка и реализация Scala * является * тесно связана с совместимостью/JVM Java во многих областях - я абсолютно уверен, что это будет тоньше разница без такового, но вы» d должен спросить Мартина (я думаю, он иногда посещает SO) или находят некоторые более ранние заметки. Хотя их можно легко «продвигать» с помощью 'method _'. – user2864740