foo*_*foo 3 ruby initialization instance-variables
我被教过用声明我的实例变量def initialize。我一直觉得我只能在我的initialize方法中声明实例变量。
但是,我@foo在initialize方法之外声明了一个实例变量,并使其按预期工作:
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)是否应该遵循最佳实践规则?
我被教过用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错误)的方式声明它们并构造代码,以使其易于阅读/遵循。
只是为了补充 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正如指令所说,可以在初始化程序中设置变量。