gpt4 book ai didi

ruby:在不使用实例的情况下调用实例方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:45:05 24 4
gpt4 key购买 nike

我知道在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 class可以看出method是实例方法,不是类方法。那么为什么我们可以在不实例化这样的东西的情况下调用它呢?

谢谢

最佳答案

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

中的方法一样使用

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com