我现在已经使用Ruby on Rails编程了将近5个星期。
我想知道为什么人们总是使用实例变量而不是本地变量。
我一直认为你只会对类使用实例变量(因此这些实例变量是该类的属性)。
但是人们不仅将它们用作类的属性。这是我感到困惑的部分。
例如,看看这些代码行:
class Foo
def print_a_hello
puts "Hello World"
end
end
@instance_variable = Foo.new
@instance_variable.print_a_hello
# => "Hello World"
locale_variable = Foo.new
locale_variable.print_a_hello
# => "Hello World"
那么,你们谁对我有一个很好的解释?
答案 0 :(得分:4)
我想知道为什么人们总是使用实例变量而不是区域设置。
我不确定你是如何得到这种印象的。我当然不“总是”使用实例变量。当我需要一个实例变量时,我使用实例变量,当我需要一个局部变量时,我使用局部变量,而且我看到的大多数代码都是以同样的方式。
通常,交换它们甚至没有意义。它们有完全不同的用途:局部变量具有静态词法范围,实例变量具有动态对象范围。除了简单的单文件程序脚本的非常狭窄的情况之外,几乎没有办法交换它们,其中顶级main
对象的动态范围和脚本体的词法范围是相同的。
我一直认为你只会对类使用实例变量(因此这些实例变量是该类的属性)。
没有。实例变量是实例的属性(即对象),而不是类,这就是它们被称为“实例变量”的原因。类变量是类的属性,但类变量是不同的野兽,仅在非常特定的情况下使用。 (类也是对象(即实例),所以它们也可以有实例变量;通常不需要使用类变量,它们具有一些奇怪和不直观的属性,除非你特别需要那些奇怪和不直观的属性)。
例如,看看这个简短的代码行:
class Foo def print_a_hello puts "Hello World" end end @instance_variable = Foo.new @instance_variable.print_a_hello # => "Hello World" locale_variable = Foo.new locale_variable.print_a_hello # => "Hello World"
我在上面提到过这种情况:在这个特定情况下(在这种情况下仅 ),顶级main
的动态范围对象和脚本体的静态词法范围是相同的,因此无论是使用脚本体的局部变量还是main
对象的实例变量都无关紧要。
然而,如果我们对其进行微小的改动,通过添加第二个脚本并从第一个脚本require
开始,那个条件将不再成立,因为我们现在有两个独立的脚本体,因此单独的脚本范围,但仍然只有一个顶级对象。
你的例子中的惯用方法肯定是使用局部变量,而我知道的其他人也不会这样做。
答案 1 :(得分:1)
当您想要将参数传递给Controller
时,实例变量的最佳用例在view
中。
然后你使用像
这样的东西class TestController < ActionController::Base
def show
@usable_in_view = Test.first
not_usable_in_view = Test.first
end
end
在view
中,您现在可以使用@usable_in_view
,但无法使用变量not_usable_in_view
。大多数人总是在控制器中使用instance variable
,即使他们不需要它们,因为他们不理解他们为什么需要instance variable
答案 2 :(得分:0)
使用实例变量,以便可以在视图页面中访问它们。 视图中无法访问局部变量。尽管在视图中不需要实例变量,但我有时会编写实例变量,这已成为习惯。: - )
答案 3 :(得分:0)
人们可能会习惯于在任何地方使用实例变量,因为在Rails中常见的是使用它们从控制器获取信息到视图。
在我自己的Ruby代码中,我只在需要时使用实例变量,否则使用局部变量。这是使用Ruby的正确方法。