Ruby ruby load file -- 学习问题

justinyun · 2013年08月16日 · 最后由 justinyun 回复于 2013年08月16日 · 2677 次阅读

下面是代码,

file1.rb

event "the sky is falling" do
    @sky_height < 300
end

event "it's getting closer" do
    @sky_height < @mountains_height
end

setup do
    puts "Setting up sky"
    @sky_height = 100
end

setup do
    puts "Settig up mountains"
    @mountains_height = 200
end

main.rb

def event(name, &block)
    @events[name] = block
end

def setup(&block)
    @setups << block
end

Dir.glob('file1.rb').each do |file|
    @setups = []
    @events = {}
    load file
    @events.each_pair do |name, event|
        env = Object.new
        @setups.each do |setup|
            env.instance_eval &setup
        end
        puts "ALERT: #{name}" if env.instance_eval &event
    end
end

执行结果如下:

Setting up sky Settig up mountains ALERT: the sky is falling Setting up sky Settig up mountains ALERT: it's getting closer

问题来了,在 main.rb 中,先调用的 load file, 应该先去执行 file1.rb 里面的方法,然后再执行下去,有点看不懂,求指点...

我看懂了代码 没看懂你的问题。。

Dir.glob('file1.rb').each do |file|
    @setups = []
    @events = {}
    load file
    @events.each_pair do |name, event|
        env = Object.new
        @setups.each do |setup|
            env.instance_eval &setup
        end
        puts "ALERT: #{name}" if env.instance_eval &event
    end
end

在上面这段代码中,执行到 load file 时,应该会执行 file1.rb 里的四个方法

event "the sky is falling" do
    @sky_height < 300
end

这里 @sky_height 实便变量还没有定义,应该会报错,不是吗?

对于程序执行的顺序,以及变量的使用情况不是很了解

注意@sky_height < 300这段代码存在于一个 block 当中,虽然跑到了但是并没有执行,它什么时候执行取决于event里何时调用这个 block,在代码中执行这个 block 的位置是puts "ALERT: #{name}" if env.instance_eval &event

谢谢,懂了,这时候让我想起了前面看到的 "延迟执行 (Deferred Evaluation)"

需要 登录 后方可回复, 如果你还没有账号请 注册新账号