Undefined Method 'downcase'


#1

Hi and goodevening, hope someone can help

i am trying to get some sort of scripting support going. I have the
following code, which executes a ruby method and return the result.
However, it is returning a method not found error from IronRuby itself

some code ommited but it’s based on the standard example. (I did make
reference to all the dlls IronRuby and IronRuby.Libraries)

var engine = IronRuby.Ruby.CreateEngine();
returnvalue = engine.Operations.InvokeMember(instance, method,
arg).ToString();

I am running the following ruby code as a test…

class Plotlight
def get_message(a)
res = "Hello- from Ruby " << a
res
end

def swapcase(a)
res = a.downcase
res
end
end

Now, when running the method get_message(“something”) things work great
however when running something that has a reference to the standard
library (swapcase in this example) it will return the error

$exception {“undefined method `downcase’ for fooBAR:ClrString”}
System.Exception {System.MissingMethodException}

running the code through ir.exe works without any problems

Do I need to make a call/reference to the library? and if I do, how do I
do that?

Hope someone can help! Thank you very much.

Kind regards, Marco


#2

A CLR string is not the same as a ruby string. Calling .to_s before
downcase
should work or you can monkey patch System::String and add the method
downcase to the clr string class if it bothers you too much

class System::String

def downcase
self.to_s.downcase
end

end


#3

Thank you Ivan, that has been most helpful!

Marco

Ivan Porto carrero wrote:

A CLR string is not the same as a ruby string. Calling .to_s before
downcase
should work or you can monkey patch System::String and add the method
downcase to the clr string class if it bothers you too much

class System::String

def downcase
self.to_s.downcase
end

end


#4

i’m sorry, another one popped up and I hope you can help me with it

it’s with this example

class Plotlight
def fib n
if n<2
n
else
res = fib(n-2)+fib(n-1)
end
end
end

when executing, I get Object must be of type String. I suspect this to
be because I am feeding it a String argument. When I do this

class Plotlight
def fib arg
n = arg.to_i
if n<2
n
else
res = fib(n-2)+fib(n-1)
end
end
end

it now says

  • $exception {“undefined method `to_i’ for 12:ClrString”}
    System.Exception {System.MissingMethodException}

so it again must be because it’s not an expected Integer…but how do I
work around this one? I am trying to understand how this works.

Thanks
Marco

Marco Kotrotsos wrote:

Thank you Ivan, that has been most helpful!

Marco

Ivan Porto carrero wrote:

A CLR string is not the same as a ruby string. Calling .to_s before
downcase
should work or you can monkey patch System::String and add the method
downcase to the clr string class if it bothers you too much

class System::String

def downcase
self.to_s.downcase
end

end


#5

ugh (slap head)

it was

n = arg.to_s.to_i

so nasty…:slight_smile:

Marco

Marco Kotrotsos wrote:

i’m sorry, another one popped up and I hope you can help me with it

it’s with this example

class Plotlight
def fib n
if n<2
n
else
res = fib(n-2)+fib(n-1)
end
end
end

when executing, I get Object must be of type String. I suspect this to
be because I am feeding it a String argument. When I do this

class Plotlight
def fib arg
n = arg.to_i
if n<2
n
else
res = fib(n-2)+fib(n-1)
end
end
end

it now says

  • $exception {“undefined method `to_i’ for 12:ClrString”}
    System.Exception {System.MissingMethodException}

so it again must be because it’s not an expected Integer…but how do I
work around this one? I am trying to understand how this works.

Thanks
Marco


#6

returnvalue = engine.Operations.InvokeMember(instance, method,
arg).ToString();

whereas arg is always String at the moment. (will change somewhere in
the future)

I can probably do a type check on arg…

Marco

Curt H. wrote:

Out of curiosity, why are you passing a string to this method through
the hosting interface instead of just passing an int? What does the
calling code look like?


#7

Out of curiosity, why are you passing a string to this method through
the hosting interface instead of just passing an int? What does the
calling code look like?