Пропуск / вывод параметров в Scala - PullRequest
3 голосов
/ 27 октября 2011

Итак, в комментарии от другой вопрос , я только что видел этот пример для подсчета числа L в строке:

"hello".count('l'==)

И достаточно безумно .. это работает.

Начиная с полностью расширенной версии, мы имеем:

"hello".count(ch => ch == 'l')

Который затем может быть уменьшен до:

"hello".count(_ == 'l')

Но тогда мы можем сделать:

"hello".count('l'==)

И я иду как ... ??? ...

Предположительно, Скала делает вывод, что мы должны были добавить _ в конце сравнения. ИМО, здесь вещи начинают становиться супер странными; это кажется за борт для меня. Может ли кто-нибудь объяснить причину, позволяющую использовать этот синтаксис, или пролить дополнительный свет на это?

Если вы думаете, что это круто, то как мы можем оправдать то, что люди могут захотеть использовать оператор ==, чтобы его можно было опустить? Тогда мы могли бы иметь:

"hello".count('l')

Я думаю, у меня есть воспоминания о кошмаре с 10 ^ 99999 возможных способов сделать что-то в Perl ...

Ответы [ 2 ]

12 голосов
/ 27 октября 2011

«Полностью развернутая» версия, с которой вы начали, на самом деле задом наперед, она должна быть:

"hello".count(ch => 'l' == ch)

Тем не менее, == не считается специальным языком Scala, это просто еще один метод Any. Итак, чтобы расширить еще дальше:

"hello".count(ch => 'l'.==(ch))

Но держитесь ... Метод count из TraversableOnce ожидает функцию с сигнатурой (A) ⇒ Boolean в качестве аргумента. Сигнатура Any.==() оказывается Any ⇒ Boolean, так что она помещается аккуратно, без необходимости оборачиваться в другую анонимную функцию. Поэтому вместо этого мы можем просто сказать:

"hello".count('l'.==)

или, без точек:

"hello" count('l' ==)

Почему бы нам не опустить оператор ==? Ну, я думаю, вы могли бы определить countEqual как count(a => a ==) (или, более кратко, count(_ ==)), если бы вы действительно хотели ... Но вы могли бы также определить countLowerCase или что-то еще. Главное здесь то, что == не особенный.

2 голосов
/ 27 октября 2011

Во-первых, давайте рассмотрим, что означает count ниже:

"hello".count('l'==)

count, здесь это метод, который принимает функцию Char => Boolean, поэтому он ожидает, что 'l'== будет,Теперь давайте рассмотрим это:

'l' ==

Это метод == в Char.Этот метод перегружен, но эта сигнатура выглядит интересно:

def == (x: Char): Boolean

Это означает, что у вас есть object.method, тип которого передается (x: Char): Boolean, где ожидается (x: Char) => Boolean.Неужели есть что еще сказать?

...