Ruby 召唤二传手和接球手

Ruby 召唤二传手和接球手,ruby,Ruby,我有一个setter和一个getter方法,用于classBook上的属性:isbn: class Book attr_accessor :isbn end book01 = Book.new book01是Book的一个实例: class Book attr_accessor :isbn end book01 = Book.new 设置实例属性时,以下哪种方法是首选方法 book01.isbn=("9876") book01.isbn= "9876" book01.isbn =

我有一个setter和一个getter方法,用于class
Book
上的属性
:isbn

class Book
  attr_accessor :isbn
end
book01 = Book.new
book01
Book
的一个实例:

class Book
  attr_accessor :isbn
end
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_accessor: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"
    
    您只是调用了相同的方法,只是使用了“语法糖”。在引擎盖后面,Ruby将所有这2项视为:

    book01.isbn=("9876")
    
    你能猜出为什么这个代码不起作用吗

    book01.isbn("9876")
    

    因为,正如我们前面看到的,在幕后Ruby创建了两个方法。第一个方法不接受任何参数,因此,您得到了您得到的错误(Ruby只是告诉您,我期望0个参数,而您提供了1个,因此我提出了ArgumentError)。

    我希望我不再对此感到困惑。我将等号视为方法调用,而不是实际方法名称的一部分。例如,在
    book01.isbn
    中,点是“book01”上的方法,因此我认为“isbn”上的等号也是方法调用
    isbn=
    ,而不是方法名称的一部分。正确吗?是的,正确,isbn和isbn=是不同的方法名,就像猫和狗一样。