呼叫二传手和吸气剂

时间:2014-10-01 15:00:10

标签: ruby

我在课程:isbn上有属性Book的setter和getter方法:

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)
    

1 个答案:

答案 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)。