在下面的示例中(source),
class Greeter
def initialize(name = "World")
@name = name
end
def say_hi
puts "Hi #{@name}!"
end
def say_bye
puts "Bye #{@name}, come back soon."
end
end
def initialize(name = "World")
在做什么?@name = name
在做什么?是初始化变量name
并将初始值设置为name
?我在网站上的示例(更多代码)中没有看到"World"
的任何进一步使用,因此我对它的使用感到困惑。
现在让我们创建一个欢迎对象并使用它:
greeter = Greeter.new("Pat") greeter.say_hi # => Hi Pat! greeter.say_bye # => Bye Pat, come back soon.
答案 0 :(得分:1)
了解@name
等实例变量与name
等局部变量之间的区别非常重要。它们不一样,但容易混淆。
初始化函数最好解释如下:
# Define an initialize method with an argument called name that has
# a default value of "World"
def initialize(name = "World")
# Assign the value of the name variable, which only exists in the
# scope of this method, to the name instance variable which exists
# for the lifespan of this Greeter object.
@name = name
end
实例变量是Ruby面向对象编程的支柱。它们是在不同方法调用之间持久保存数据的最方便的方法。
要行使默认行为,您根本无法指定name
应该是什么:
greeter = Greeter.new
greeter.say_hi
答案 1 :(得分:1)
<强> 1。什么是
def initialize(name = "World")
在做什么?
当您创建Greeter
的新实例时,如果没有传递参数,那么def initialize
会将新实例的默认@name
属性设置为等于{ {1}}。
<强> 2。
"World"
在做什么?是初始化变量@name = name
并将初始值设置为name
?
name
是一个实例变量,来自同一个类的其他方法可以查看和使用。在这种情况下,它采用传递给方法的@name
参数。有关详细信息,请参阅实例变量。
示例强>
在您的示例name
中,参数定义为greeter = Greeter.new("Pat")
,因此忽略"Pat"
的默认参数。