2015-06-28 63 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是一個模塊。您的類別SimpleFile包含此模塊。所以模塊方法包含在你的課SimpleFile。這意味着,所有的模塊方法現在可以像SimpleFile

中的方法一樣使用,參見http://ruby-doc.org/core-2.2.0/Module.html瞭解關於ruby模塊的更多信息。這是一個很棒的功能。

+0

我明白了。我誤讀了。消息不是一個類,而是一個模塊。這是有道理的。謝謝@rob。 – BufBills

1

被調用的實例。在Ruby中,如果忽略發送消息的顯式接收方,則假定爲隱式接收方self。所以,deserialize被調用的實例,即self

注意這個確切的同樣的現象也發生在你的代碼中的其他地方,(在1號線,在事實)早得多:

require 'fileutils' 
require_relative 'message' 

在這裏,你也有兩個方法調用沒有明確的接收器,這意味着隱式接收器是self

相關問題