2016-10-05 15 views
1

У меня есть этот код:Scala - как не называй унарную методу

def +(s: String) = s.headOption 

val foo = +("hello") 

При попытке скомпилировать его, я получаю ошибку компиляции:

Error: value unary_+ is not a member of String 
    val foo = +("hello") 

Как я могу предотвратить компилятор от вставка вызова в String.unary_-, но вместо этого вызов метода в области?

+0

Там будет вопрос, почему это необходимо 'this.f (ARG)', чтобы получить неявное преобразование на 'this' (преобразование его к чему-то с 'f'), почему не' f (arg) 'достаточно. Это может быть хорошим примером, почему бы и нет. Или, может быть, они оба являются аргументом, чтобы попробовать 'this.expr' перед сбоем. –

ответ

1
val foo = this.+("hello") //this will call the class, object etc. and you will get the correct reference for the method :) 

Или:

import <path>._ 

val foo = classname.+("hello") 

Или:

import <path>.<class> 

val foo = <class>.+("hello") 

Ex:

package test 

object SO { 

    def +(s:String) = s.headOption 

} 

package test 

object add extends App { 
    import test.SO 

    println(SO.+("hello")) 
} 

Res:

Some(h) 

Ex2:

package test 

class SO {} 
object SO { 
    def apply(): SO = { 
     new SO 
    } 
    def +(s:String) = s.headOption 
} 



package test 

object add extends App { 
    import test.SO 

    println(SO.+("string")) 
} 

Res:

Some(s) 
+0

Вы попробовали? – Dima

+0

Это не работает, если метод импортирован –

+0

@Dima да и он работает – Jonatan