Ruby - 为什么可以使用像所有地方一样的实例变量

时间:2015-02-18 14:53:22

标签: ruby-on-rails ruby

我现在已经使用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"

那么,你们谁对我有一个很好的解释?

4 个答案:

答案 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的正确方法。