2014-10-01 140 views
2

我有一個二傳手和屬性:isbnBook類getter方法:調用getter和setter方法

class Book 
    attr_accessor :isbn 
end 

book01Book一個實例:

book01 = Book.new 
  1. 哪一個是設置實例屬性的首選方式是什麼?

    book01.isbn=("9876") 
    book01.isbn= "9876" 
    book01.isbn = "9876" 
    
  2. 爲什麼這不能作爲一個選項?

    book01.isbn("9876") 
    # => ArgumentError: wrong number of arguments (1 for 0) 
    

回答

3

在您的例子:

book01.isbn=("9876") 
book01.isbn= "9876" 
book01.isbn = "9876" 

最後的兩個例子是「語法糖」,這是事情,在技術上不正確的語法,但都保存在語言,因爲他們不斷代碼清理器。第一個例子是Ruby不支持語法糖的唯一方法。爲什麼?

因爲attr_acccessor:ISBN篷子後面爲您創建下面的代碼:

def isbn 
    @isbn 
end 

def isbn=(new_isbn) 
    @isbn = new_isbn 
end 

這些是2種完全不同的方法,因爲在名稱唯一的區別是等號(=),這可能會造成混亂。但這並不意味着什麼,也不會改變他們完全不同的方法。 所以有:

book01.isbn=("9876") 

你實際上調用高清ISBN =(new_isbn),這是一種方法,僅此而已,沒有別的。與:

book01.isbn= "9876" 
book01.isbn = "9876" 

你只是調用SAME方法,只是使用'語法糖'。在引擎蓋後面,Ruby將所有這2個視爲:

book01.isbn=("9876") 

你能猜出爲什麼這段代碼不起作用嗎?

book01.isbn("9876") 

因爲,正如我們前面看到的,Ruby背後創建了2個方法。第一種方法不接受任何參數,因此,你會得到你得到的錯誤(Ruby只是告訴你,我期望0個參數,而你提供了1,因此我提出了ArgumentError)。

+0

我希望我不會對此感到困惑。我將等號看作方法調用,而不是實際方法名稱的一部分。例如,在'book01.isbn'中,點是「book01」上的方法,所以我認爲「isbn」上的等號也是一個方法調用「isbn =',而不是方法名稱的一部分。正確? – mann 2014-10-01 15:42:18

+0

是的,正確的,isbn和isbn =是不同的方法名稱,就像貓和狗一樣。 – daremkd 2014-10-01 16:03:09