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

为什么不同的方法在Ruby类中共享相同的参数?,ruby,Ruby,我在Ruby的开头看到了以下程序,无法理解set\u first\u name(first\u name)和set\u last\u name(last\u name)的目的,以及为什么这两个方法set\u first\u name和set\u last\u name使用相同的参数name,因为我认为这个名字包括姓和姓 class Person def initialize(name) set_name(name) end def name @first_name

我在Ruby的开头看到了以下程序,无法理解
set\u first\u name(first\u name)
set\u last\u name(last\u name)
的目的,以及为什么这两个方法
set\u first\u name
set\u last\u name
使用相同的参数
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

啊。这是一个可怕的介绍。在确定“name”是一个局部变量还是一个方法时,有相当多的魔力。根据你所做的,你可以从一个切换到另一个

将以下方法添加到类中:

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赋值。这让我头疼,但这是合法的。在下一个puts中,
name
现在引用该局部变量。我们可以通过指定
self.name
返回该方法

老实说,正如其他人所注意到的,这个类的名称很糟糕(呵呵,双关语的意思?:)。如果可以,最好避免这种混淆

大卫·布莱克有一本名为《有良好基础的红宝石家》的书。第五章特别详细地讨论了这一点。总的来说,这是一本很棒的书。没有关系,只是一个快乐的顾客


我可以看到混淆-类
Person
有一个名为
name
的方法,并使用参数
name
设置first\u name
设置last\u name
。是的,这对于介绍文本来说有点草率,但是ruby解析器将它们视为完全不同的实体。如果
set_first_name
的参数名是
first_name
,并且与
set_last_name
相同,但功能仍然相同,则会更清楚。这是您过度思考的时候之一。参数值可以是随机字符串,也可以更具指示性。当你考虑它的时候,它其实并不重要,因为你理解了参数的用途和意义。在您自己的代码中,为确切的术语而苦恼是可以的,但是,真的,不要在这方面停滞不前。在编程中会遇到很多更大的问题。