'books=(books)' 方法在做什么?

what a method 'books=(books)' is doing?

我加入了 Rails 团队并维护代码。 有些对象是由 Gem virtus 控制的,但我真的不明白下面的代码在做什么。

我理解'latest_book'属性可以从Books中收集最新书籍的结果,但为什么可以呢? 'books=(books)' 在做什么?为什么 'super books' 在这里?

class GetBooks
  include Virtus.model
  include ActiveModel::Model

  attribute :books, Array[Book]
  attribute :latest_book, Book

  def books=(books)
    self.latest_book = books.sort_by { |book| book['createdate'] }.last
    super books
  end
end

你能帮帮我吗?

def books=(books) 正在定义一个名为 books= 的方法,它接受一个参数 books。是的,这令人困惑。它可能应该是 def books=(value)def books=(new_books).

是的,= 是方法名称的一部分。 self.books = value 确实是 self.books=(value) 的语法糖。同样,该方法是 books=.

super bookssuper(books)super 调用下一个继承或包含的同名方法;它正在调用 attribute :books, Array[Book] 创建的 books=。这是一个 "method override" 允许您添加到现有方法的行为。

当调用 books= 时,它会更新 latest_books,然后调用其原始方法来设置 books 属性。

gb = GetBooks.new
gb.books = [old_book, new_book]

p gb.latest_book # new_book
p gb.books       # [old_book, new_book]