2013-11-27 59 views
0

我開始紅寶石看到下面的程序,並不能弄清楚set_first_name(first_name)set_last_name(last_name)和目的爲何兩種方法set_first_nameset_last_name用同樣的理由name,因爲我覺得這個名字包括first_namelast_name爲什麼不同的方法在Ruby類中共享相同的參數?

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 
+2

我能看到的困惑 - 類'Person'有一個名爲'name'方法和使用參數'name'爲'set_first_name'和'set_last_name'。是的,這對於介紹文本來說有點草率,但Ruby解析器將它們視爲完全不同的實體。如果參數名稱爲'set_first_name'爲'first_name',並且與'set_last_name'相同,但是仍然可以起作用,則會更清楚。 – Matt

+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現在指的是該局部變量。我們可以通過指定self.name來回到方法。

老實說,正如其他人已經注意到,這個班名字很差(heh,雙關語意圖?:)。如果可以的話,最好避免這種混淆。

大衛·布萊克有一本書,名爲The Well-Grounded Rubyist。第5章特別詳細介紹了這一點。這是一本很好的書。沒有從屬關係只是一個幸福的客戶。

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

相關問題