ruby:调用实例方法而不使用实例

标签 ruby class object methods

我知道在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

.....

你可以看到我用“<===”标记的行 它使用消息类中定义的反序列化函数。 从消息类中我们可以看出该方法是实例方法,而不是类方法。 那么为什么我们可以在不实例化这样的东西的情况下调用它呢?

谢谢

最佳答案

Message 是一个模块。您的类 SimpleFile 包含此模块。因此模块方法包含在您的类 SimpleFile 中。这意味着,所有模块方法现在都可以像 SimpleFile

中的方法一样使用

参见http://ruby-doc.org/core-2.2.0/Module.html有关 ruby​​ 中模块的更多信息。这是一个很棒的功能。

关于ruby:调用实例方法而不使用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096197/

相关文章:

ruby - 无法使用 Require 加载模块

ruby - 为什么使用 AJAX 的 rspec 示例无法正常工作?

Ruby Mechanize https 错误

ruby - 为什么这个Hash of arrays的size是0?

Python:制作一个在任何函数调用上都返回 None 的类

c# - 尝试查找给定深层嵌套类/对象的属性名称

javascript - 再次: JS functions and objects

c++ - 使用指针访问类的私有(private)或 protected 数据

C++ 未初始化的类数组

javascript - 从 JavaScript 中的对象返回两个单独的数组