老实说,我仍然对实例变量和局部变量感到困惑,不确定应该使用哪个。
我所知道的只有一个不能使用的局部变量的条件是:
class MyClass
def initialize
local_var = 1
@instance_var = 1
end
def show_local_var
local_var
end
def show_instance_var
@instance_var
end
end
显然,MyClass.new.show_instance_var
在MyClass.new_show_local_var
而非
关于这两种变量的另一个问题是块似乎共享相同的局部范围,因此可以引用局部变量:
local_var = 1
3.times do
puts local_var
end
我所知道的区别是什么,还有其他可用吗?请让我知道
如果有任何关于此的文章,这对我有用,
答案 0 :(得分:2)
本地变量“就在这里”,无法从其他任何地方访问。
class MyClass
def foo
local_var = 2
#I use this to do some sort of calculation
@instance_var = local_var + 34
local_var = 5 * @instance_var
puts local_var
end
# From here, local_var is unaccessible.
end
一旦你超出范围(foo
end
已通过)local_var
已不复存在,无法被引用。
实例变量始终可供整个班级使用。
class MyClass
def initialize
@instance_var = 0
end
def foo
local_var = 2
#I use this to do some sort of calculation
@instance_var = local_var + 34
end
def some_operation
if @instance_var == 36
@instance_var = 3
else
@instance_var = 1
end
end
end
因此,当您致电m = MyClass.new
以及稍后m.some_operation
时,它正在使用相同的@instance_var
。
虽然我们在这里,但也有类变量(定义{{1}}),可以从类的任何实例访问。
我没有特别为您提供的文章,但有些关于@@class_var
的Google搜索以及每种类型的变量应该为您提供所需的所有信息!
答案 1 :(得分:2)
您描述的第二个示例称为Closure。保罗非常好地说:
闭包是一个符合三个标准的代码块:
- 它可以作为值和
传递- 具有该值的任何人按需执行
- 它可以从创建它的上下文中引用变量(即,在“闭合”一词的数学意义上,它关于变量访问是关闭的。)
有关Ruby中可用范围的简短快速介绍,您可以参考Ruby Programming wikibook。
有
“默认范围”,因为在执行没有范围修饰符的代码时有时会引用它,如
@iv = "Who do I belong to?"
是“主要”对象的范围。
答案 2 :(得分:1)
本地范围仅限于声明变量的位置,即函数或for循环,但不能从该位置外部访问。但是,如果在函数,for循环等中嵌套其他构造,则内部构造可以访问局部变量。实例变量的范围限定为类的实例。