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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top