[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

porting java methods to ruby

dare ruby

11/21/2007 10:00:00 AM

could any one help me out to solve this.

Following is a function java

Actually the following function has a character array as a return type

public char[] getTextCharacters(int [] holderForStartAndLength)
{
}

Could any one help me to do the same in ruby


Thank you in advance
--
Posted via http://www.ruby-....

24 Answers

Peter Szinek

11/21/2007 10:07:00 AM

0

Hi,

> public char[] getTextCharacters(int [] holderForStartAndLength)
> {
> }
>
> Could any one help me to do the same in ruby

Oh sure!

def getTextCharacters(holder_for_start_and_length)
end

> Actually the following function has a character array as a return type

It doesn't matter. Ruby is a dynamic language. Please check out these
slides:

http://onestepback.org/articles...

Cheers,
Peter

___
http://www.rubyra...
http://s...

Robert Klemme

11/21/2007 10:18:00 AM

0

2007/11/21, Peter Szinek <peter@rubyrailways.com>:
> Hi,
>
> > public char[] getTextCharacters(int [] holderForStartAndLength)
> > {
> > }

This won't even compile because there is no "return" statement. Also,
using an array to pass two values is at best sub optimal. And since
you do not provide any details about the class at hand nobody can
really help you.

> > Could any one help me to do the same in ruby
>
> Oh sure!
>
> def getTextCharacters(holder_for_start_and_length)
> end

LOL

Actually, we can make this even *more* rubyish:

def get_text_characters holder_for_start_and_length
end

:-)

Cheers

robert

--
use.inject do |as, often| as.you_can - without end

Peter Szinek

11/21/2007 10:23:00 AM

0

Robert Klemme wrote:
> 2007/11/21, Peter Szinek <peter@rubyrailways.com>:
>> Hi,
>>
>>> public char[] getTextCharacters(int [] holderForStartAndLength)
>>> {
>>> }
>
> This won't even compile because there is no "return" statement. Also,
> using an array to pass two values is at best sub optimal. And since
> you do not provide any details about the class at hand nobody can
> really help you.
>
>>> Could any one help me to do the same in ruby
>> Oh sure!
>>
>> def getTextCharacters(holder_for_start_and_length)
>> end
>
> LOL
>
> Actually, we can make this even *more* rubyish:
>
> def get_text_characters holder_for_start_and_length
> end

Ah, thanks Robert :-) The most trivial tasks are the easiest to screw
up, right?

___
http://www.rubyra...
http://s...



Ryan Davis

11/21/2007 10:23:00 AM

0


On Nov 21, 2007, at 02:00 , Martin Durai wrote:

> Actually the following function has a character array as a return type
>
> public char[] getTextCharacters(int [] holderForStartAndLength)
> {
> }


Having done far too much of this recently, my guess is it'll look
something like:

> def get_text_characters
> result = []
>
> # get the characters and start from whatever...
>
> return result, start
> end

I ignored the holderForStartAndLength because the name hints that they
are a stupid java hack for not having rich return values. In
get_text_characters we don't bother with length because our array (or
string... depends on how you actually want to use it) knows it's
length and we return the start offset with it. You'd call it like:

> chars, offset = get_text_characters




dare ruby

11/21/2007 10:26:00 AM

0

Hi peter,

i have attached my java code which i have to port to ruby. could you
help me with this

public char[] getTextCharacters(int [] holderForStartAndLength)
{
if( eventType == TEXT ) {
if(usePC) {
holderForStartAndLength[0] = pcStart;
holderForStartAndLength[1] = pcEnd - pcStart;
return pc;
} else {
holderForStartAndLength[0] = posStart;
holderForStartAndLength[1] = posEnd - posStart;
return buf;

}
} else if( eventType == START_TAG
|| eventType == END_TAG
|| eventType == CDSECT
|| eventType == COMMENT
|| eventType == ENTITY_REF
|| eventType == PROCESSING_INSTRUCTION
|| eventType == IGNORABLE_WHITESPACE
|| eventType == DOCDECL)
{
holderForStartAndLength[0] = posStart;
holderForStartAndLength[1] = posEnd - posStart;
return buf;
} else if(eventType == START_DOCUMENT
|| eventType == END_DOCUMENT) {
//throw new XmlPullParserException("no content available to
read");
holderForStartAndLength[0] = holderForStartAndLength[1] =
-1;
return null;
} else {
throw new IllegalArgumentException("unknown text eventType:
"+eventType);
}
// String s = getText();
// char[] cb = null;
// if(s!= null) {
// cb = s.toCharArray();
// holderForStartAndLength[0] = 0;
// holderForStartAndLength[1] = s.length();
// } else {
// }
// return cb;
}

All these code comes unde java version of pull parser

Robert Klemme wrote:
> 2007/11/21, Peter Szinek <peter@rubyrailways.com>:
>> Hi,
>>
>> > public char[] getTextCharacters(int [] holderForStartAndLength)
>> > {
>> > }
>
> This won't even compile because there is no "return" statement. Also,
> using an array to pass two values is at best sub optimal. And since
> you do not provide any details about the class at hand nobody can
> really help you.
>
>> > Could any one help me to do the same in ruby
>>
>> Oh sure!
>>
>> def getTextCharacters(holder_for_start_and_length)
>> end
>
> LOL
>
> Actually, we can make this even *more* rubyish:
>
> def get_text_characters holder_for_start_and_length
> end
>
> :-)
>
> Cheers
>
> robert

--
Posted via http://www.ruby-....

Robert Dober

11/21/2007 10:41:00 AM

0

On Nov 21, 2007 11:23 AM, Ryan Davis <ryand-ruby@zenspider.com> wrote:
>
> On Nov 21, 2007, at 02:00 , Martin Durai wrote:
>
> > Actually the following function has a character array as a return type
> >
> > public char[] getTextCharacters(int [] holderForStartAndLength)
I do not like this ---------------------------------^

def get_text_chars start=0, length=1

IOW you cannot port Java to Ruby, it will remain Java in disguise.

Robert
--
what do I think about Ruby?
http://ruby-smalltalk.blo...

Robert Klemme

11/21/2007 10:48:00 AM

0

2007/11/21, Martin Durai <martin@angleritech.com>:
> Hi peter,
>
> i have attached my java code which i have to port to ruby. could you
> help me with this
>
> public char[] getTextCharacters(int [] holderForStartAndLength)
> {
> if( eventType == TEXT ) {
> if(usePC) {
> holderForStartAndLength[0] = pcStart;
> holderForStartAndLength[1] = pcEnd - pcStart;
> return pc;
> } else {
> holderForStartAndLength[0] = posStart;
> holderForStartAndLength[1] = posEnd - posStart;
> return buf;
>
> }
> } else if( eventType == START_TAG
> || eventType == END_TAG
> || eventType == CDSECT
> || eventType == COMMENT
> || eventType == ENTITY_REF
> || eventType == PROCESSING_INSTRUCTION
> || eventType == IGNORABLE_WHITESPACE
> || eventType == DOCDECL)
> {
> holderForStartAndLength[0] = posStart;
> holderForStartAndLength[1] = posEnd - posStart;
> return buf;
> } else if(eventType == START_DOCUMENT
> || eventType == END_DOCUMENT) {
> //throw new XmlPullParserException("no content available to
> read");
> holderForStartAndLength[0] = holderForStartAndLength[1] =
> -1;
> return null;
> } else {
> throw new IllegalArgumentException("unknown text eventType:
> "+eventType);
> }
> // String s = getText();
> // char[] cb = null;
> // if(s!= null) {
> // cb = s.toCharArray();
> // holderForStartAndLength[0] = 0;
> // holderForStartAndLength[1] = s.length();
> // } else {
> // }
> // return cb;
> }
>
> All these code comes unde java version of pull parser

First of all I would create a class for the return values, like

TextSubRange = Struct.new :text, :start, :end

Then I would change all the if (x==..||x==...) to use a case statement.

Btw, I would do the same to the Java code (i.e. create another class
and use "switch").

Cheers

robert

--
use.inject do |as, often| as.you_can - without end

dare ruby

11/21/2007 10:53:00 AM

0

Thank you robert,


my task is to port java classes and methods to ruby just like tha above
one.

could you help me with this porting



>
> Then I would change all the if (x==..||x==...) to use a case statement.
>
> Btw, I would do the same to the Java code (i.e. create another class
> and use "switch").
>
> Cheers
>
> robert

--
Posted via http://www.ruby-....

Peter Hickman

11/21/2007 11:23:00 AM

0

The simplest conversion is this:

def getTextCharacters(holholderForStartAndLength)
case @eventType
when TEXT
if @usePC
holderForStartAndLength[0] = @pcStart
holderForStartAndLength[1] = @pcEnd - @pcStart
return @pc
else
holderForStartAndLength[0] = @posStart
holderForStartAndLength[1] = @posEnd - @posStart
return @buf
end
when START_TAG, END_TAG, CDSECT, COMMENT, ENTITY_REF,
PROCESSING_INSTRUCTION, IGNORABLE_WHITESPACE, DOCDECL
holderForStartAndLength[0] = @posStart
holderForStartAndLength[1] = @posEnd - @posStart
return @buf
when START_DOCUMENT, END_DOCUMENT
holderForStartAndLength[0] = holderForStartAndLength[1] = -1
return nil
else
raise "unknown text eventType: " + @eventType
end
end

Of course this is untested and assumes that the class that defines it
will also set up the various class variables (the @something in the
code) and the constants (the SOMETHING in the code). You should also
consider creating your own exception class for the raise.

Please also read "Pounding A Nail: Old Shoe or Glass Bottle?" by Alex
Papadimoulis at
http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/4...

Why the hell are you not using an existing ruby xml library, you know
that your's will be the slowest xml parser on earth?

This endeavour is made of fail.


Richard Conroy

11/21/2007 12:45:00 PM

0

On Nov 21, 2007 10:25 AM, Martin Durai <martin@angleritech.com> wrote:
> Hi peter,
>
> i have attached my java code which i have to port to ruby. could you
> help me with this

<code snipped>

I would refactor that code before you consider porting it to anything. Theres
a lot of external dependencies and a lot of unsafe constructs. That single
function uses the following instance members:
usePC
eventType
pcStart
pcEnd
posStart
posEnd
pc
buf
getText

You are also not doing a lot of input value checking, and the function is very
non-DRY. All of the return values are side effects of the method,
defined elsewhere.
The position holder (the function argument) should be a class.

However its par for the course in Java really. However even in Java you would
find that function very difficult to unit test without complex mocking.

You would never write a Ruby function that behaved like that. You would break
up the responsibilities of the function into individual pieces
(functions), then take advantage
of Ruby's better literal syntax and conditionals to clear up the messy
conditionals.
(The Ruby switch statement is a thing of beauty).