«Méthode inconnue» utilisant IronRuby en C #
Question
Salut et bonne soirée, j'espère que quelqu'un pourra aider.
J'essaie de faire avancer une sorte de support de script. J'ai le code suivant, qui exécute une méthode Ruby et renvoie le résultat. Cependant, il renvoie une "méthode non trouvée" d'IronRuby lui-même.
var engine = IronRuby.Ruby.CreateEngine();
returnvalue = engine.Operations.InvokeMember(instance, method, arg).ToString();
J'exécute le code Ruby suivant comme test:
class Plotlight
def get_message(a)
res = "Hello- from Ruby " << a
res
end
def swapcase(a)
res = a.downcase
res
end
end
Maintenant, lors de l'exécution de la méthode get_message("something")
, les choses fonctionnent très bien. Cependant, lors de l'exécution de quelque chose qui a une référence à la bibliothèque standard (swapcase dans cet exemple), il renverra l'erreur
$exception {"undefined method `downcase' for fooBAR:ClrString"} System.Exception {System.MissingMethodException}
Exécuter le code via ir.exe
fonctionne sans aucun problème.
Dois-je faire une référence à la bibliothèque, et si je le fais, comment puis-je faire cela?
J'espère que quelqu'un pourra aider! Merci beaucoup.
Sincères amitiés,
Marco
La solution
Les cordes Ruby ont une sémantique incompatible avec les cordes CLR. En particulier, ils sont mutables. L'interoprose entre les chaînes Ruby et les chaînes CLR n'est pas encore terminée, donc pour l'instant vous devrez lancer explicitement le système CLR.String dans un objet de chaîne Ruby - soit dans votre code C # ou dans votre code Ruby.
La solution la plus simple consiste à définir Swapcase comme ceci:
def swapcase(a)
String.new(a).downcase
end