调用getter和setter方法
问题描述:
我有一个二传手和属性:isbn
上Book
类getter方法:调用getter和setter方法
class Book
attr_accessor :isbn
end
book01
是Book
一个实例:
book01 = Book.new
-
哪一个是设置实例属性的首选方式是什么?
book01.isbn=("9876") book01.isbn= "9876" book01.isbn = "9876"
-
为什么这不能作为一个选项?
book01.isbn("9876") # => ArgumentError: wrong number of arguments (1 for 0)
答
在您的例子:
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)。
我希望我不会对此感到困惑。我将等号看作方法调用,而不是实际方法名称的一部分。例如,在'book01.isbn'中,点是“book01”上的方法,所以我认为“isbn”上的等号也是一个方法调用“isbn =',而不是方法名称的一部分。正确? – mann 2014-10-01 15:42:18
是的,正确的,isbn和isbn =是不同的方法名称,就像猫和狗一样。 – daremkd 2014-10-01 16:03:09