【问题标题】:ruby: calling a instance method without using instanceruby:调用实例方法而不使用实例
【发布时间】:2015-06-28 04:39:03
【问题描述】:

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

.....

你可以看到我用“

谢谢

【问题讨论】:

    标签: ruby class object methods


    【解决方案1】:

    Message 是一个模块。你的班级SimpleFile 包括这个模块。所以你的类SimpleFile中包含的模块方法。这意味着,所有模块方法现在都可以像 SimpleFile 中的方法一样使用

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

    【讨论】:

    • 我明白了。我看错了。 Message 不是一个类,而是一个模块。现在这是有道理的。谢谢@rob。
    【解决方案2】:

    正在在一个实例上被调用。在 Ruby 中,如果您省略了消息发送的显式接收者,则假定为隐式接收者 self。所以,deserialize 正在在一个实例上被调用,即self

    请注意,这种完全相同的现象也发生在代码的其他地方,更早(实际上是在第 1 行):

    require 'fileutils'
    require_relative 'message'
    

    这里还有两个没有显式接收器的方法调用,这意味着隐式接收器是self

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2015-01-17
      • 1970-01-01
      • 2014-02-22
      • 2011-02-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多