【问题标题】:Return a String with LuaInterface使用 LuaInterface 返回一个字符串
【发布时间】:2013-08-12 21:58:40
【问题描述】:

所以,我正在尝试将 Lua 实现为 C# 中的脚本语言。如果您将它用作控制台应用程序的一部分,它真的很简单。但我希望能够在 XNA 中创建一个游戏机。问题是 Lua.DoString() 似乎返回一个控制台行,而不是一个字符串 - 正如我所说,这对于控制台应用程序来说很好,但我想将它作为字符串添加到输出缓冲区,以便我可以显示它在游戏中,而不是在控制台窗口中。如果这令人困惑,我深表歉意 - 希望代码能够清除它。

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 返回字符串.

如果我的问题杂乱无章或解释不清,我深表歉意 - 我试图尽可能简洁,但这是一个小众问题,我真的不知道如何解释它。哦,我确实尝试过谷歌,我浏览了 Stack Overflow 上所有 65 个左右的 LuaInterface 问题,所以我有 95% 的把握在问这个问题之前已经完成了我的尽职调查。我猜,LuaInterface 并不是一个众所周知的工具。

【问题讨论】:

  • 在某些时候你不需要new Lua() 吗?否则,lua 始终为空引用。 this.lua = lua 只是将字段 lua 分配给自己,那里应该有编译器警告。
  • ^ 我认为他是对的。你没有在那个构造函数中做任何事情。
  • 不错,迈克 z。我不敢相信我自己没有注意到……但实际代码(只是稍微)更复杂,Lua 实例作为参数传递到类中……所以,是的,这是一个大问题在我的示例代码中,但它绝对不能解决我的问题。
  • 这篇文章可能对你有所帮助:dreamincode.net/forums/topic/…
  • @mikez - 所示代码(没有您发现的错误)有效 - 但仅作为控制台应用程序。我的问题是我看不到一种方法可以将 Lua 的输出读入 C# 中的字符串变量,以将其用作图形输入。

标签: c# xna console lua luainterface


【解决方案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 命令。

【讨论】:

  • 是的,我已经放弃了这种方法。我认为 .ToString() 是某些对象的默认方法,即使(在这种情况下)对象本身不能转换为字符串。不过,这个例外并不是我真正遇到的问题。
  • ToString 是object 上的虚拟方法,每个编写良好的类都应该有一个不抛出的实现。但它不会保护您免于取消引用 null。
  • 我尝试了您关于使用return "test" 的想法,但它并不完全工作,但至少可以说结果很有趣。它将“System.Object[]”打印到控制台。我查看了Lua.DoString() 源代码,它确实具有Object[] 的返回类型。我不知道通用对象数组如何转换为控制台行...无论如何,感谢您的建议。
  • return "test" 将返回一个对象数组,其第一个元素是一个字符串。你看到我的编辑了吗?即,您可以使用 [0] 提取第一个元素,然后转换为字符串。当然,对于更健壮的代码,您绝对应该在提取值之前检查返回数组的长度。
  • 你太棒了,谢谢。我之前尝试过exampleObject[0],但没有尝试return()。我将它与print() 一起使用并遇到了各种各样的问题......但它就像你描述的那样工作。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2019-11-06
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2021-09-18
相关资源
最近更新 更多