« Return to Thread: Re: [scala-user] Problem with default arguments and multiple method signatures

Re: [scala-user] Problem with default arguments and multiple method signatures

by James Iry-2 :: Rate this Message:

Reply to Author | View in Thread

Would it be feasible to mangle the getter's name using the parameter types of the overloaded methods? 

def foo(x : T1 = xdef, y : T2 = ydef)
def foo(z : T3 = zdef, zz : T4 = zzdef)

def foo$T1$T2$defaul1 = xdef
def foo$T1$T2$defaul2 = ydef
def foo$T3$T4$default1 = zdef
def foo$T3$T4$default2 = zzdef


On Mon, Jun 1, 2009 at 11:12 PM, Lukas Rytz <lukas.rytz@...> wrote:
Hi Sciss,

If you overload a method, only one alternative is allowed to specify
default arguments; you should see an error message telling you
exactly that.

The fact that the "... is defined twice" error messages are printed is
a flaw of the current implementation and we're trying to fix that.


The reason for the above restriction: we want to have deterministic
names for the default getters (methods computing the defaults), so
that when you re-compile a single file, you get the same bytecode.
If we allowed multiple alternative to have defaults, we'd need to
add some numbering to the default getters, which would break
this stability.


Cheers: Lukas




On Tue, Jun 2, 2009 at 06:26, Sciss <contact@...> wrote:
hi,

i am integrating the great new default arguments feature of scala 2.8. unfortunately i run into problems... in the following code, i get

method apply$default$2 is defined twice
method apply$default$3 is defined twice

...

object OSCReceiver {
       @throws( classOf[ IOException ])
       def apply( protocol: Symbol, port: Int = 0, loopBack: Boolean = false, c: OSCPacketCodec = OSCPacketCodec.getDefaultCodec ) : OSCReceiver = {
               val localAddress = new InetSocketAddress( if( loopBack ) "127.0.0.1" else "0.0.0.0", port )
               apply( protocol, localAddress, c )
       }

       @throws( classOf[ IOException ])
       def apply( protocol: Symbol, localAddress: InetSocketAddress, c: OSCPacketCodec = OSCPacketCodec.getDefaultCodec ) : OSCReceiver = {
               if( protocol == 'udp ) {
                       new UDPOSCReceiver( localAddress, c )
                       
               } else if( protocol == 'tcp ) {
                       new TCPOSCReceiver( localAddress, c )
                       
               } else {
                       throw new IllegalArgumentException( ScalaOSC.getResourceString( "errUnknownProtocol" ) + protocol )
               }
       }

       @throws( classOf[ IOException ])
       def apply( dch: DatagramChannel, c: OSCPacketCodec = OSCPacketCodec.getDefaultCodec ) : OSCReceiver = {
               new UDPOSCReceiver( dch, c )
       }

       // [...]
}

i understand, i could rename the second method to applyWithAddress and the third to applyWithChannel but that destroys the beauty of the OSCReceiver( ... ) constructors. is there any trick to solve this problem?

ciao, -sciss-



 « Return to Thread: Re: [scala-user] Problem with default arguments and multiple method signatures