2015-06-28 3 views
2

Я знаю, что в 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 

..... 

Вы можете увидеть линию я помеченный «< ===» Она использует функцию десериализации, что было определено в классе сообщений. И из класса сообщений мы можем видеть, что этот метод является методом экземпляра, а не методом класса. Так почему мы можем назвать это, не создавая ничего подобного?

благодаря

ответ

1

Message IST модуля. В ваш класс SimpleFile входит этот модуль. поэтому методы модуля включены в ваш класс SimpleFile. это означает, что теперь все методы модуля могут использоваться как методы от SimpleFile

см. http://ruby-doc.org/core-2.2.0/Module.html для получения дополнительной информации о модуле в рубине. это отличная функция.

+0

я вижу. Я неправильно прочитал. Сообщение не класс, а модуль. Теперь это имеет смысл. спасибо @rob. – BufBills

1

Это вызывается на экземпляр. В Ruby, если вы не учитываете явный приемник отправки сообщения, подразумевается неявный приемник self. Таким образом, deserialize: вызывается на экземпляр, а именно self.

Обратите внимание, что это точно такое же явление происходит и в других местах в вашем коде, гораздо раньше (в строке 1, на самом деле):

require 'fileutils' 
require_relative 'message' 

Здесь вы также два метода вызовов без явного приемника, что подразумеваемый приемник равен self.

Смежные вопросы