Sinatra 以前我都是这么理解 get “/” do ....end 的,get 是函数调用,然后 “/” 是第一个参数,do end 代码块是第二个参数

匿名 · 2014年01月12日 · 最后由 lhy20062008 回复于 2014年03月26日 · 7789 次阅读

但是出现问题了: 这个不好描述啊,我尽量描述下:

app.rb

require "sinatra"

    @var=  "  abc "

    get  "/"  do
        @var= " 123  "
         erb  :index
    end

index.erb

< %= @var %>

按照我以前的理解访问 0.0.0.0:4567 应该输出 abc

但是输出的是 123 啊,

然后我开始以为是被覆写了,简单的注释掉了@var=“123”如下:

app.rb

require "sinatra"

    @var=  "  abc "

    get  "/"  do
   #     @var= " 123  "
         erb  :index
    end

index.erb

< %= @var %>

然后访问 0.0.0.0:4567 就什么都不显示了,一片空白啊。

get 到底是不是个函数的调用啊??

get 是会函数调用没错,代码块也是它的参数没错,但是 get 被调用的时候,这个代码块并没有被执行,它被 sinatra 存储了起来,当 sinatra 接受到一个 request 时,这个代码块才可能会被执行,而这个代码块可能是在某个对象的环境中被执行的,例如有可能是这样的:

env = Object.new
env.instance_eval &block

这个 env 对象在 sinatra 里到底是什么,你可以在代码块里 看下 self 是什么

匿名 #2 2014年01月12日

如果把顶级实例变量@var(top_level_instance_variable)改成“类变量”@@var(在这个语境下真心不知道应该叫@@var 什么,叫它类变量的话,是那个类的类变量呢?),views 那边就可以显示出@@var 的值,不过 sinatra 会 warning

匿名 #3 2014年01月13日

#1 楼 @lululau 我 self.inspect 了一下,一团麻啊。 不过 self.class 倒是很清楚 Sinatra::Application

另外在 irb 中 self,self.inspect,self.class 全部没有回显,应该是没有 request 代码块没有执行吧

这个就是静态语言特有的了,只有在方位“/”才会给@var赋值,然后 erb:inexe 的时候,值就是 123 了。

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