Sinatra中的Ruby变量与实例变量

Sinatra中的Ruby变量与实例变量,ruby,sinatra,Ruby,Sinatra,在Sinatra中,可以通过两种方式声明变量;要么: get '/' do var = 5 end 或 为什么要用其中一个呢 另外,从技术上讲,您不应该不能使用@,因为它不在类中,因此实例变量没有意义吗?实例变量设置在对象上,您是对的 但您也可以在类上使用它们,例如,因为它们也是对象。这可能很难理解,但在ruby中,一切都是对象,因此您可以在任何地方(几乎?)设置实例变量 当您调用sinatra“get”方法时。您正在传递一个应该在对象上下文中运行的块。例如,以后可以在视图中使用 ge

在Sinatra中,可以通过两种方式声明变量;要么:

get '/' do
    var = 5
end

为什么要用其中一个呢


另外,从技术上讲,您不应该不能使用
@
,因为它不在类中,因此实例变量没有意义吗?

实例变量设置在对象上,您是对的

但您也可以在类上使用它们,例如,因为它们也是对象。这可能很难理解,但在ruby中,一切都是对象,因此您可以在任何地方(几乎?)设置实例变量

当您调用sinatra“get”方法时。您正在传递一个应该在对象上下文中运行的块。例如,以后可以在视图中使用

get '/' do
  @var = 5
end

我不确定您应该使用哪一个,如果您在视图中需要它们,我会坚持使用instance@variables,如果您只想在操作/路由中使用它们,我会坚持使用局部变量。因此,如果您能够访问
var
变量,而不是
:get
处理程序,它会说
:get
处理程序就是闭包。这是人们期待的行为。在第二种情况下,
@var
成为
main
类实例的实例变量。所以这也是预期的行为。@majioa我不理解你的评论,请你重新措辞好吗?所以基本上正常的变量被限制在块中,而@variables可以在视图中使用?你在哪里不能设置实例变量,只是出于好奇?我记得你应该可以在任何地方使用它。如果是这样的话,它和正则变量有什么区别?它只是一个更大的范围吗?@Aristides:实例变量是在对象上设置的。顶层是在一个名为“main”的特殊对象的上下文中(您可以通过在顶层编写“putself”来看到这一点)。某些对象始终是self,因此您可以始终设置实例变量,尽管您设置的任何ivar显然不会从其他对象中可见。
get '/' do
  @var = 5
end