2014-10-01 144 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