【问题标题】:IronRuby, How to pass argument variables from C# to Ruby?IronRuby,如何将参数变量从 C# 传递到 Ruby?
【发布时间】:2013-01-27 21:03:32
【问题描述】:

首先,这是我在 SharpDevelop 项目的 bin/debug 文件夹中设置的 ruby​​ 文件的代码:

class Run_Marshal

    def initialize(id, name)
        @list = []
        @list[0] = Employee_Info.new(id, name)

        File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
    end


end

class Employee_Info

    attr_accessor :id
    attr_accessor :name

    def initialize(id, name)
        @id = id
        @name = name
    end

end

上面的代码允许将 Employee_Info 对象序列化为文件。请注意,我已经安装了 IronRuby。

下面是我用来执行 ruby​​ 代码的 C# 代码。将参数从 C# 传递给新的 Ruby 对象很重要。

void Btn_exportClick(object sender, EventArgs e)
{
            var engine = Ruby.CreateEngine();
            engine.ExecuteFile("Ruby_Classes.rb");
            dynamic ruby = engine.Runtime.Globals;

            int id = 0;
            string name = "John Coles";

            dynamic foo = ruby.Run_Marshal.@new(id, name);
}

最后,这是在另一个不同的 ruby​​ 环境中设置的另一个 ruby​​ 项目的 ruby​​ 代码。

@my_foo = File.open("Data/employee_sheet.es", "rb") {|f| Marshal.load(f)}
@name = @my_foo[0].name

当然,我还确保 Employee_Info 类在其他环境中可用。

class Employee_Info

    attr_accessor :id
    attr_accessor :name

    def initialize(id, name)
        @id = id
        @name = name
    end

end

代码在我的 SharpDevelop 项目中完美运行,并在 bin/debug 文件夹中输出序列化(编组)文件。然后我把这个序列化文件放在另一个 ruby​​ 环境的另一个文件夹中。

当我运行另一个环境时,程序崩溃并产生这个错误:“ArgumentError发生。未定义的类/模块系统::”

我又做了一些测试,我意识到当我将上面的代码更改为这个时(参见带有三个'*'的行:

class Run_Marshal

    def initialize(id, name)
        @list = []
        @list[0] = Employee_Info.new(0, "Beettlejuice") // ***

        File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
    end


end

它现在打开序列化文件没有任何问题。所以我怀疑问题是由于从 C# 代码传递给 ruby​​ 代码的参数。我确实需要为更复杂的任务传递 c# 变量,但到目前为止我不知道如何使它工作。我希望你们能解释什么是错的。那么如何将参数变量从 C# 传递给 Ruby?

谢谢!

【问题讨论】:

    标签: c# ruby argument-passing ironruby


    【解决方案1】:

    我无法解释如何以及为什么,但我通过这种方式解决了问题:

    class Run_Marshal
    
        def initialize(id, name)
            @list = []
            @list[0] = Employee_Info.new(id, name.to_s)
    
            File.open("employee_sheet.es", "wb") {|f| Marshal::dump(@list, f)}
        end
    end
    

    我将 to_s 添加到传递的字符串中。显然 Ruby 没有将参数识别为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2023-03-09
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多