Я знаю, что в ruby, когда мы вызываем метод экземпляра, нам нужно сначала создать экземпляр объекта класса. Но когда я вижу открытый исходный код, я смутился. код выглядит так:ruby: вызов метода экземпляра без использования экземпляра
File Message.rb
require 'json'
module Yora
module Message
def serialize(msg)
JSON.generate(msg)
end
def deserialize(raw, symbolized_key = true)
msg = JSON.parse(raw, create_additions: true)
if symbolized_key
Hash[msg.map { |k, v| [k.to_sym, v] }]
else
msg
end
end
end
end
File. Persistance.rb
require 'fileutils'
require_relative 'message'
module Yora
module Persistence
class SimpleFile
include Message
def initialize(node_id, node_address)
@node_id, @node_address = node_id, node_address
FileUtils.mkdir_p "data/#{node_id}"
@log_path = "data/#{node_id}/log.txt"
@metadata_path = "data/#{node_id}/metadata.txt"
@snapshot_path = "data/#{node_id}/snapshot.txt"
end
def read_metadata
metadata = {
current_term: 0,
voted_for: nil,
cluster: { @node_id => @node_address }
}
if File.exist?(@metadata_path)
metadata = deserialize(File.read(@metadata_path)) #<============
end
$stderr.puts "-- metadata = #{metadata}"
metadata
end
.....
Вы можете увидеть линию я помеченный «< ===» Она использует функцию десериализации, что было определено в классе сообщений. И из класса сообщений мы можем видеть, что этот метод является методом экземпляра, а не методом класса. Так почему мы можем назвать это, не создавая ничего подобного?
благодаря
я вижу. Я неправильно прочитал. Сообщение не класс, а модуль. Теперь это имеет смысл. спасибо @rob. – BufBills