2014-10-13 2 views
3

Сначала я определить ! метод:Я могу определить метод оператора bang, но я не могу назвать его в Scala. Зачем?

scala> def !() = "hi" 
$bang:()java.lang.String 

Теперь я могу назвать это так:

scala> $bang() 
res3: java.lang.String = hi 

Но это оленья кожа»работа:

scala> !() 
<console>:8: error: value unary_! is not a member of Unit 
       !() 

Даже это не работает:

scala> `!`() 
<console>:8: error: value unary_! is not a member of Unit 
       `!`() 
      ^

Что я здесь делаю неправильно? Почему я могу определить !(), когда я не могу его вызывать?

EDIT1

Добавление ссылки на объект дает ошибку:

scala> this.!() 
<console>:8: error: value ! is not a member of object $iw 
       this.!() 
       ^
+0

Что происходит, когда вы покидаете от скобки? – rightfold

ответ

1
!foo 

интерпретируется как

foo.unary_! 

Если вы хотите назвать ваш метод, вы должны указать явный приемник, например

this.!() 

или

this !() 

или

this !() 
+0

Внутри REPL 'this.!()' И его варианты не работают. Пожалуйста, проверьте EDIT1 в вопросе. – tuxdna

+0

Внутри REPL многие вещи работают по-другому. В этом конкретном случае, внутри REPL, 'this' является самим интерпретатором (или, точнее, рабочей областью интерпретатора), поэтому вам явно нужно добавить метод'!() 'К объекту интерпретатора, если вы хотите позвонить это так. –