2016-03-13 4 views
3

Рассмотрим следующий сценарий: У меня есть класс тестInfix обозначения и (...) не работает, как я ожидал

class Test() { 
    infix fun say(msg: String) = println(msg) 
} 

и основной метод

fun main(args: Array<String>) { 
    val test = Test() 

    test say "Hello World!" //Works 

    with(test) { 
     say "Goodbye World!" //Does not work 
     say("Hello again!") //Works 
    } 
} 

Как вы можете видеть, что я тестирую нотацию infix. Учитывая, что with(...) позволяет вам работать с объектом, переданным как параметр в , с блоком без необходимости доступа к его членам через точечную нотацию, я бы ожидал, что нотация инфикса будет работать, как показано в моем примере выше.

К сожалению, это не работает, есть ли причина, по которой это не работает? Это ошибка или просто ограничение? Или, может быть, я не интерпретирую функцию with(...) правильно?

ответ

6

Обозначение Infix касается синтаксиса способа его использования. Он работает с объектом слева и параметром справа.

При использовании with у вас больше нет указателя на объект слева, поэтому специальный синтаксис для нотации infix больше не работает. Вы должны вернуться к стандартной нотации функций.

1

Это ограничение необходимо, чтобы анализатор анализировал код без конфликтов с другим синтаксисом.