论坛首页 编程语言技术论坛

原来ruby不能在runtime自动识别源代码的更改?

浏览 3131 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-15  
说起来还是挺出乎我的意料的,但是好像就是这样。我昨天试验了一下:

随别写个什么函数foo,在运行时用gets先获得用户在console中的输入,然后在运行foo。我先把程序run起来,然后修改foo的内容,接着在console中输入一些字符串,运行结果是foo在修改之前应该输出的结果。

从结果看来,ruby把源代码加载进来后,就不去动态检查它是不是被修改了。而且从require和load方法的说明上看,require只加载一次,load会在每次用到的时候加载。

我一直以为ruby所谓的动态语言是可以在runtime动态响应源代码的修改的,现在看起来好像不是。那么它的动态到底是什么呢?仅仅是动态类型吗?还有,RoR中我改变一些源代码,马上就可以响应到application中,这难道是server的功能,而不是ruby的能力?
   发表时间:2006-12-15  
看一下下面这个例子:
ruby 代码
 
  1. 5.times do |i|  
  2.   File.open("temp.rb","w"do |f|  
  3.     f.puts "module Temp"  
  4.     f.puts " def Temp.var"  
  5.     f.puts " #{i}"  
  6.     f.puts " end"  
  7.     f.puts "end"  
  8.   end  
  9.   load "temp.rb"  
  10.   puts Temp.var  
  11. end  

输出是:
1
2
3
4
5

看来如果想在运行时动态加载代码,要手动调用load,看来这应该就是解决问题的方法了。和Java对比一下,java中没有什么好的方法可以动态加载一个.class文件,即使加载进去了,使用的时候也很不方便(作为meta object来使用)。不知道Java什么时候也可以动态reload。

不过像Ruby这样也会有安全上的问题。比如javaeye,如果我能从某些渠道了解到它的源代码,哪怕只是一点点。那么Ruby中的class是open的,有可以动态load文件,我就可以做很多的“事情”,这个要怎么解决呢。
0 请登录后投票
   发表时间:2006-12-15  
服务器不在你手里,你怎么做?
0 请登录后投票
   发表时间:2006-12-15  
发表文章的时候上传附件。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics