2013-08-01 1 views
4

Я изучаю Scala и играю с подходящим ассоциированным объектом unapply. Я знаю, что если имя заканчивается на «:», то оно становится правильным ассоциативным. Однако, по-видимому, существуют некоторые странные ограничения на именованиеScala right ассоциативные методы

например. Это недопустимый

object cons: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object :_cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

Они действительны

object cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object >>: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

Так что, кажется, некоторые странности о смешивании буквенно-цифровых знаков и символов в идентификаторах.

Так что, в основном, я хочу иметь описательное имя i.e. «cons» и по-прежнему иметь правую ассоциативность. Кроме того, я бы хотел, чтобы мой оператор был симметричен по эстетическим соображениям :-), поэтому мне не нравится cons_:
Есть ли способ сделать что-то связанное справа без использования двоеточия? Или любые другие предложения для достижения этого?

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

ответ

3

С the spec (раздел 1.1):

Есть три способа для формирования идентификатора. Во-первых, идентификатор может начать с буквы, за которой может следовать произвольная последовательность из букв и цифр. За этим могут следовать символы подчеркивания '_' и другая строка, состоящая из букв и цифр или символов . Во-вторых, идентификатор может начинаться с символа оператора , за которым следует произвольная последовательность символов оператора. Предыдущие две формы называются равными идентификаторами. Наконец, идентификатор также может быть сформирован произвольной строкой между обратными кавычками (хост-системы могут налагать некоторые ограничения, для которых строки являются легальными для идентификаторов). Затем идентификатор состоит из всех символов, исключая сами обратные кавычки.

Таким образом, похоже, что вам не повезло - если ваш идентификатор начинается с :, он не может содержать символы без оператора. Заметим, однако, что вы можете написать следующее (который не предназначен, чтобы сделать что-то значимое, просто чтобы продемонстрировать синтаксис):

scala> class X { def `:cons:`(i: Int) = i } 
defined class X 

scala> val x = new X 
x: X = [email protected] 

scala> 1 `:cons:` x 
res1: Int = 1 

Имя метода до сих пор заканчивается двоеточием, так что вы получите правильную ассоциативность, которую вы ищете.

+0

Отлично! Я не знал об использовании обратных тиков для разрешения произвольных идентификаторов. Спасибо – ekj

+0

Последний символ не является кадром, это двоеточие. Символы кавычек в цитированном идентификаторе больше не становятся частью идентификатора, чем символы кавычек в строковом литерале. Последний символ строки, обозначаемой строковым литералом '' Hello '', не' '', это 'o'. –

+0

@ JörgWMittag: Ого, это было невероятное неправильное чтение с моей стороны -« исключение »прямо там В моей защите это было очень рано, и я все еще немного ожесточен [this] (http://stackoverflow.com/q/17863794/334519). Я отредактировал, чтобы убрать мое удивление, что работает подход backtick. –