#c# #ironpython #ironruby #dynamic-language-runtime
#c# #ironpython #ironruby #динамический язык выполнения
Вопрос:
Существует ли общий метод преобразования объекта среды выполнения Dynamic Language Runtime (DLR) в строковое представление? Например, вот пример, где obj проверяется на наличие пары определенных типов (в данном случае Python):
if (obj is IronPython.Runtime.List) {
repr = ((IronPython.Runtime.List)obj).__repr__(
IronPython.Runtime.DefaultContext.Default);
} else if (obj is IronPython.Runtime.PythonDictionary) {
repr = ((IronPython.Runtime.PythonDictionary)obj).__repr__(
IronPython.Runtime.DefaultContext.Default);
Но я бы действительно хотел получить представление obj на его собственном языке (IronPython, IronRuby и т.д.) И без необходимости сравнивать с каждым типом. obj.toString () не дает хорошего представления для большинства объектов.
Комментарии:
1. Ну, вы могли бы получить одно представление для каждого языка ( repr , если оно существует to_s, если оно существует, то toString в противном случае), но конкретного способа нет. Лучшее, что вы могли бы сделать, это иметь список эквивалентных языку «toString» и проверять их все. Но вам не нужно, как в вашем примере, управлять каждым типом объекта отдельно.
2. Хорошо, это работает для объектов IronPython: похоже, что у всех них есть метод » repr » в C #. Но не похоже, что объекты IronRuby имеют метод «to_s» на уровне C #.
3. Я не могу понять, почему, поскольку это находится в
Object
классе ( ruby-doc.org/core-1.9.3/Object.html#method-i-to_s ) я не очень разбираюсь в ruby или python, но то, что я знаю, говорит мне, что каждый объект ruby должен предоставлятьto_s
метод. Также предполагается, что эквивалентом__repr__
должно бытьinspect
( ruby-doc.org/core-1.9.3/Object.html#method-i-inspect ) предполагается, что whileto_s
является эквивалентом__str__
в python.
Ответ №1:
AFAIK, нет единого общего метода для преобразования объектов DLR в их репрезентативные строковые представления. Это зависит от языка, и, к сожалению, они реализованы по-разному.
По крайней мере, с IronPython вы всегда могли просто получить ссылку на встроенный модуль, а затем вызвать str()
(или repr()
) функцию для ваших объектов.
var engine = Python.CreateEngine();
dynamic obj = engine.Execute("[1, 2, 3, 4, 5]");
dynamic builtin = engine.GetBuiltinModule();
string repr = builtin.str(obj);
Конечно, вы могли бы вызвать функцию и внутри скрипта.
string repr = (string)engine.Execute("str([1, 2, 3, 4, 5])");
Другим вариантом было бы использовать одну из многих операций, определенных в IronPython.Runtime.Operations
пространстве имен.
string repr = IronPython.Runtime.Operations.PythonOps.ToString(obj);
Я не очень знаком с IronRuby, но вызов to_s()
некоторых объектов, кажется, иногда работает. В противном случае он фактически возвращает объект .NET, которого to_s
не существует, и он не очень надежен. Я думаю, что проще сделать это в скрипте.
var engine = Ruby.CreateEngine();
string repr = (string)engine.Execute("[1, 2, 3, 4, 5].to_s");
Возможно, вам захочется осмотреться и посмотреть, есть ли другие методы, которые вы могли бы использовать.
Комментарии:
1. Часть моей проблемы заключается в том, что это автономные объекты, и я не знаю, с какого языка они взяты. Задача состоит в том, чтобы пройти через разделяемый ScriptScope, который не зависит от языка, но показывает объекты так, как они отображаются на языке хоста (или в некотором общем представлении). Я воспользовался предложением VirtualBlackFox для поиска метода repr , и это работает для IronPython, но я ничего не могу найти о методах IronRuby. У меня также не было бы способа сделать это для будущих языков DLR. Возможно, метод ToRepr() следует добавить к базовому объекту на всех языках.