我在Beginning Ruby中看到了以下程序,并且无法弄清楚set_first_name(first_name)
和set_last_name(last_name)
的目的以及为什么两个方法set_first_name
和set_last_name
使用相同的方法参数name
,因为我认为该名称包含first_name
和last_name
。
class Person
def initialize(name)
set_name(name)
end
def name
@first_name + ' ' + @last_name
end
def set_name(name)
first_name, last_name = name.split(/\s+/)
set_first_name(first_name)
set_last_name(last_name)
end
def set_first_name(name)
@first_name = name
end
def set_last_name(name)
@last_name = name
end
end
p = Person.new("Fred Bloggs")
puts p.name
答案 0 :(得分:0)
唉。这是一个可怕的介绍。确定“名称”是否是局部变量或方法有相当多的魔力。根据您的操作,您可以将其从一个切换到另一个。
将以下方法添加到您的班级:
def test
puts name
name = "Bob"
puts name
puts self.name
end
然后像这样运行:
p = Person.new('Jane Doe')
p.test
您将获得以下输出:
Jane Doe
Bob
Jane Doe
发生的事情是,首先找不到name
作为局部变量,因此它寻找一个方法(并且如果有的话,将查找该类的祖先/模块)。然后我们为name分配一个值。这让我头疼,但是合法。在下一个put name
现在引用该局部变量。我们可以通过指定self.name
来回到该方法。
老实说,正如其他人已经注意到这个课程的名字很差(嘿,双关语打算?)。如果可以的话,最好避免这种混淆。
大卫布莱克有一本名为The Well-Grounded Rubyist的书。第5章特别详细介绍了这一点。这是一本很棒的书。没有任何关系只是一个快乐的客户。