在`initialize`方法之外声明一个实例变量

foo*_*foo 3 ruby initialization instance-variables

我被教过用声明我的实例变量def initialize。我一直觉得我只能在我的initialize方法中声明实例变量。

但是,我@fooinitialize方法之外声明了一个实例变量,并使其按预期工作:

class FooBar
    def initialize(bar)
        @bar = bar
    end

    def foo_as_instance_var
        @foo = @bar.split(' ')
        @foo
    end
end

x = "something wicked this way comes"
y = FooBar.new(x)
puts y.foo_as_instance_var
Run Code Online (Sandbox Code Playgroud)

为什么我可以在initialize方法外部声明实例变量?由于我可以在任何方法中声明实例变量,因此关于在哪里声明实例变量(即在中声明它们initialize)是否应该遵循最佳实践规则?

Ste*_*fan 5

我被教过用def initialize声明实例变量

由于initialize是对象生命周期中的第一个实例方法调用,因此通常在此处声明实例变量,以确保正确初始化变量。这也是我期望在读取代码时定义实例变量的第一位。

我一直觉得我只能在自己的initialize方法中声明实例变量。

没有这样的限制。您可以在实例中的任何位置声明实例变量。

常用的是备忘录

class FooBar
  def foo
    @foo ||= expensive_operation
  end
end
Run Code Online (Sandbox Code Playgroud)

在第一次调用时,它将评估expensive_operation并将结果分配给@foo。在随后的呼叫中,@foo被返回。

另一个流行的例子是Rails,它使用实例变量将数据从控制器传递到其视图:

class FooController < ApplicationController
  def index
    @foos = Foo.all
  end
end
Run Code Online (Sandbox Code Playgroud)

关于在哪里声明实例变量,是否应该遵循最佳实践规则?

这取决于它们的目的(请参见上面的示例)。通常,以避免未定义变量(nil错误)的方式声明它们并构造代码,以使其易于阅读/遵循。


Ser*_*sev 5

只是为了补充 Stefan 的出色回答

我被教导用以下命令声明我的实例变量 def initialize

ruby 新手常犯的一个错误是这样的:

class Person
  @name = "John"

  def introduce
    puts "Hi, my name is #{@name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后他们想知道为什么不打印他们的名字。为了使这项工作,@name正如指令所说,可以在初始化程序中设置变量。