我在课程:isbn
上有属性Book
的setter和getter方法:
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)
答案 0 :(得分:3)
在你的例子中:
book01.isbn=("9876")
book01.isbn= "9876"
book01.isbn = "9876"
最后两个例子是'syntactic sugar',它们在技术上在语法上不合适但是保留在语言中,因为它们使代码更清晰。第一个例子是如果Ruby不支持语法糖的唯一方法。为什么呢?
因为幕后的attr_acccessor:isbn会为您创建以下代码:
def isbn
@isbn
end
def isbn=(new_isbn)
@isbn = new_isbn
end
这是两种完全不同的方法,这可能会令人困惑,因为名称的唯一区别是=符号。但这并不意味着什么,并没有改变它们完全不同的方法。 所以:
book01.isbn=("9876")
你实际上是在调用def isbn =(new_isbn)这是一种方法,仅此而已。随着:
book01.isbn= "9876"
book01.isbn = "9876"
你只是在调用SAME方法,只是使用'syntactic sugar'。在引擎盖后面,Ruby将所有这两个视为:
book01.isbn=("9876")
你能猜出为什么这段代码不起作用吗?
book01.isbn("9876")
因为,正如我们之前看到的,引擎盖后面的Ruby创建了两种方法。第一种方法不接受任何参数,因此,你得到了你得到的错误(Ruby只是告诉你,我预期0个参数,你提供了1,因此我提出了ArgumentError)。