加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

保存动态Ruby类

发布时间:2020-12-17 03:25:46 所属栏目:百科 来源:网络整理
导读:我有一个好奇的问题.如果我有一个 ruby类然后我在执行期间动态添加类方法,类变量等,那么我还是保存更改的类定义,以便下次启动我的应用程序时我可以再次使用它吗? 解决方法 简单地编组对象(正如其他人所说)不会工作.让我们看一个例子.考虑这个课程: class E
我有一个好奇的问题.如果我有一个 ruby类然后我在执行期间动态添加类方法,类变量等,那么我还是保存更改的类定义,以便下次启动我的应用程序时我可以再次使用它吗?

解决方法

简单地编组对象(正如其他人所说)不会工作.让我们看一个例子.考虑这个课程:

class Extras
  attr_accessor :contents
  def test
    puts "This instance of Extras is OK. Contents is: " + @contents.to_s
  end

  def add_method( name )
    self.class.send :define_method,name.to_sym do
      puts "Called " + name.to_s
    end
  end
end

现在让我们编写一个程序来创建一个实例,为它添加一个方法并将其保存到磁盘:

require 'extras'

fresh = Extras.new
fresh.contents = 314
fresh.test # outputs "This instance of Extras is OK. Contents is: 314"
fresh.add_method( :foo )
fresh.foo # outputs "Called foo"

serial = Marshal.dump( fresh )
file = File.new "dumpedExample",'w'
file.write serial

所以我们可以调用普通方法’test’和动态方法’foo’.让我们看看如果我们编写一个加载保存到磁盘的Example实例的程序会发生什么:

require 'extras'

file = File.new 'dumpedExample','r'
serial = file.read

reheated = Marshal.load( serial )
reheated.test # outputs "This instance of Extras is OK. Contents is 314"
reheated.foo # throws a NoMethodError exception

所以我们可以看到,虽然保存了实例(包括成员变量的值),但动态方法却没有.

从设计的角度来看,最好将所有添加的代码放入模块中,并在下次运行程序时再将其加载到类中.我们需要一个很好的例子,告诉你如何使用它,但要真正了解这一点.

如果您需要额外的信息来重新创建方法,那么让模块将它们保存为成员变量.包含在模块中的实现,当它包含在类中时,它会查找这些成员变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读