2013-05-15 4 views
2

Я пытался использовать тип Int следующим образом: 10 twotimes.Как я могу устранить эту точку? Я тестировал неявное преобразование

Он похож на пакет продолжительности Akka, который позволяет писать, например, 10 minutes и 5 seconds.

я сделал следующее:

object ImplicitConversion2 { 
    class Test(val a:Int) { 
    def threetimes = a * 3 
    } 

    implicit def IntToTest(e:Int) = new Test(e) 

    5.threetimes     //> res0: Int = 15 
    10.threetimes    //> res1: Int = 30 
    11.threetimes    //> res2: Int = 33 
} 

В этом случае, я могу использовать threetimes как 10.threetimes, то есть с точкой между 10 и threetimes. Я хочу устранить точку между Int и threetimes.

Но если я напишу 5 threetimes, произойдет ошибка. Как я могу это сделать?

+0

мое английское выражение крайне плохое, поэтому я подумал об этом, и теперь мне не нужно беспокоиться о том, что спасибо! chris – Notice

+0

Нет проблем. Другое дело, может быть, в вашей первой строке вы хотели использовать 'threetimes' вместо' twotimes'?Это неважно, просто говорю;) – chris

+0

да, я хотел использовать метод threetimes, который позволяет умножить что-то 3 раза, потому что я просто хочу его протестировать. – Notice

ответ

3

В какой версии Scala вы подразумеваете? С версией 2.10.1 я получаю предупреждение в особенности, а именно, что я хотел бы добавить следующее

import scala.language.implicitConversions 

активировать неявные преобразования. После этого, как вы сказали, 10.threetimes работает отлично, но для 10 threetimes я получаю другую функцию предупреждения, который говорит мне, чтобы добавить:

import scala.language.postfixOps 

, чтобы позволить операторам постфиксных. После этого все работает нормально.

EDIT: Вот отрывок из оригинального SIP (можно найти here), что дает причину, почему Постфиксные операторы теперь обескураженный по умолчанию (то есть, вы получите предупреждение, если вы используете их, а в более поздних версиях это может превратиться в ошибку вместо предупреждения):

postfixOps. Только в тех случаях, когда разрешено, допускается сообщение оператора postfix (expr op). Зачем хранить эту функцию? Несколько DSL, написанных на Scala, нуждаются в нотации. Зачем это контролировать? Постфиксные операторы слабо взаимодействуют с выводами с точкой с запятой. Большинство программистов избегают их по этой причине.

+0

Я использую версию scala 2.10.0, я установлю ее новую версию и протестирую ее, спасибо Крису! – Notice

+0

Пробовал ли мое решение для вас (с вашей текущей версией Scala)? (Я думаю, что это должно произойти), т. Е. Просто добавьте вышеупомянутый 'import' в ваш файл. – chris

3

Как правильно заявляет Луиджи Плинг в своем комментарии, компилятор пытается использовать линию после вызова оператору постфикса в качестве аргумента. Если вы посмотрите на сообщение об ошибке становится ясно: значит

<console>:10: error: Int does not take parameters 
      3 threetimes 

Эта ошибка, что он пытается использовать что-то в качестве аргумента, где она не принадлежит. Тот факт, что использование точечной нотации исправляет эту ошибку, должно сделать ее очевидной, что пойдет не так. Единственный способ безопасного использования постфиксных операторов - передать их в качестве аргументов, где либо ), либо , завершает это выражение.

def foo(x: Int, y: Int) = x + y 

foo(4 threetimes, 8 threetimes) 
+0

Я встречался с проблемой, спасибо за ваше предложение! – Notice