为什么不同的方法在Ruby类中共享相同的参数?

时间:2013-11-27 23:20:57

标签: ruby

我在Beginning Ruby中看到了以下程序,并且无法弄清楚set_first_name(first_name)set_last_name(last_name)的目的以及为什么两个方法set_first_nameset_last_name使用相同的方法参数name,因为我认为该名称包含first_namelast_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

1 个答案:

答案 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章特别详细介绍了这一点。这是一本很棒的书。没有任何关系只是一个快乐的客户。

http://www.manning.com/black2/