2013-08-12 6 views
0

Итак, я пытаюсь реализовать Lua как язык сценариев на C#. Это достаточно просто, если вы используете его как часть консольного приложения. Но я хочу создать игровую консоль в XNA. Проблема в том, что Lua.DoString(), кажется, возвращает консольную строку, а не строку, которая, как я уже сказал, отлично подходит для консольных приложений, но я хочу добавить ее в выходной буфер в виде строки, чтобы я мог отображать это в игре, а не в консольном окне. Приносим извинения, если это запутывает - надеюсь, код очистит его.Вернуть строку с LuaInterface

using System; 
using System.Collections.Generic; 
using LuaInterface; 

namespace LuaConsoleLibrary 
{ 
    public class LuaConsole 
    { 
     private Lua lua; 

     private bool isRunning = true; 
     private string input; 
     private List<string> outputBuffer; 

     public bool IsRunning 
     { 
      get { return isRunning; } 
     } 

     public LuaConsole() 
     { 
      this.lua = lua; 
     } 

     public void Run() 
     { 
      int i = 0; 
      while(isRunning) 
      { 
       outputBuffer.Add("> "); 

       input = Console.ReadLine(); 
       outputBuffer.Add(""); 

       try 
       { 
        lua.DoString(input); 
       } 
       catch(Exception e) 
       { 
        outputBuffer.Add(e.Message); 
       } 
       finally 
       { 
        outputBuffer.Add(""); 
       } 
      } 
     } 
    } 
} 

В принципе, я запутался, почему lua.DoString(input); должен работать, в отличие от того, чтобы использовать Console.WriteLine(lua.DoString(input));. Я даже пробовал outputBuffer.Add(lua.DoString(input).ToString());, который, будучи там, ToString действителен там, должен работать теоретически. Вместо этого он выполняет lua.DoString, а затем генерирует исключение - «Ссылка на объект не установлена ​​в экземпляр объекта». Если я не ошибаюсь, объект, о котором идет речь, составляет Lua, что делает действительным ссылку на объект lua. В любом случае, поскольку эти два решения не работают, мне было интересно, знает ли кто-нибудь о LuaInterface, чтобы предложить альтернативный способ получить тот же результат. Я действительно хочу что-то сделать с результатом outputBuffer.Add(lua.DoString(input));. Кстати, команда Lua, которую я использовал для тестирования, это print("test"). Возможно, print как-то возвращает строку консоли вместо строки, но я не могу придумать другой способ вернуть строку из Lua.

Прошу прощения, если моя проблема бессвязная или плохо объясняемая. Я старался быть максимально лаконичным, но это своего рода проблема ниши, и я не знаю, как еще это объяснить. О, и я попробовал Google, и я просмотрел все 65 вопросов или вопросов LuaInterface о переполнении стека, поэтому я на 95% уверен, что сделал свою должную осмотрительность, прежде чем задавать этот вопрос. Полагаю, LuaInterface просто не так хорошо известен из инструмента.

+0

Вам не нужен 'новый Lua()' в какой-то момент? В противном случае 'lua' всегда является пустой ссылкой. 'this.lua = lua' просто присваивает поле' lua' самому себе, и там должно быть предупреждение о компиляторе. –

+0

^Думаю, он прав на этом. Вы ничего не делаете в этом конструкторе. –

+0

Хороший улов, майк z. Я не могу поверить, что сам этого не заметил ... но фактический код (только немного) сложнее, и экземпляр Lua передается в класс как параметр ... Итак, да, это огромная проблема в моем примере кода, но это определенно не решает мою проблему. – bpunsky

ответ

1

Object reference not set to instance of an object - это способ C# сказать, что «что-то не имеет значения, и этого не должно быть».

В этом случае, скорее всего DoString возвращает null, поэтому null.ToString() создает исключение. Вы можете попробовать outputBuffer.Add(Convert.ToString(lua.DoString(input)[0])), если вы хотите конвертировать в строку, не бросая нули.

Я не использовал ни LuaInterface, ни NLua, но я бы предположил, что для возврата строки вам действительно нужно выполнить return "test" в качестве вашей команды Lua.

+0

Да, я отказался от этого подхода. Я думаю, что .ToString() - это метод по умолчанию для определенных объектов, даже если (как в этом случае) объект не может по сути быть преобразован в строку. Исключение - это не настоящая проблема, которую я имею. – bpunsky

+0

ToString - это виртуальный метод для 'object', и каждый хорошо написанный класс должен иметь реализацию без металирования. Но он не «защитит вас от разыменования нулевого значения. – Jimmy

+0

Я пробовал вашу идею об использовании 'return 'test", и это не точно _work_, но результаты интригуют, если не сказать больше. Он печатает «System.Object []» на консоли. Я посмотрел на источник 'Lua.DoString()', и у него действительно есть возвращаемый тип 'Object []'. Я не знаю, как массив общих объектов переводится в консольную линию ... В любом случае, спасибо за предложение. – bpunsky

Смежные вопросы