Ruby类单例方法返回self,为什么?
我一直在使用两个Ruby库(Hashicorp的Vault)和(WeAreFarmGeek的外交官),它们使用单例类范例,其中类本身是访问底层客户机函数的通用方式。在像Chef这样的框架中,我看到了这一点的好处,因为一旦正确配置了类,所有的烹饪书都可以使用它 我想了解如何做到这一点,并且已经阅读并非常了解至少ruby vault代码在做什么。然而,有一行代码我无法理解它的功能。我希望这里有人能给我解释一下 如果您查看下面来自()的代码片段,您将看到当需要库时,Ruby类单例方法返回self,为什么?,ruby,Ruby,我一直在使用两个Ruby库(Hashicorp的Vault)和(WeAreFarmGeek的外交官),它们使用单例类范例,其中类本身是访问底层客户机函数的通用方式。在像Chef这样的框架中,我看到了这一点的好处,因为一旦正确配置了类,所有的烹饪书都可以使用它 我想了解如何做到这一点,并且已经阅读并非常了解至少ruby vault代码在做什么。然而,有一行代码我无法理解它的功能。我希望这里有人能给我解释一下 如果您查看下面来自()的代码片段,您将看到当需要库时,设置 方法,该方法“创建”一个新的客
设置代码>
方法,该方法“创建”一个新的客户机,该客户机通过方法允许类本身作为客户机运行
我不明白的代码的一部分是为什么设置
方法需要返回self
。我已经查看了整个模块代码库,顶层文件是安装程序的唯一位置!被调用,因此我无法探究作者为什么选择返回self
。这就是问题所在
谢谢
module Vault
require_relative "vault/errors"
require_relative "vault/client"
require_relative "vault/configurable"
require_relative "vault/defaults"
require_relative "vault/response"
require_relative "vault/version"
require_relative "vault/api"
class << self
# API client object based off the configured options in {Configurable}.
#
# @return [Vault::Client]
attr_reader :client
def setup!
@client = Vault::Client.new
# Set secure SSL options
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options].tap do |opts|
opts &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
opts |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
opts |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2)
opts |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
end
self
end
# Delegate all methods to the client object, essentially making the module
# object behave like a {Client}.
def method_missing(m, *args, &block)
if @client.respond_to?(m)
@client.send(m, *args, &block)
else
super
end
end
# Delegating +respond_to+ to the {Client}.
def respond_to_missing?(m, include_private = false)
@client.respond_to?(m, include_private) || super
end
end
end
# Load the initial default values
Vault.setup!
模块保险库
需要相对的“保险库/错误”
需要相对的“保险库/客户机”
需要相对的“保险库/可配置”
需要相对的“保险库/默认值”
需要相对的“保险库/响应”
需要相对的“保险库/版本”
需要相对的“vault/api”
类返回值从未使用过,因此它没有特定的原因。一般来说,返回self
是实现a的一种方法。感谢您花时间查看并回复。非常感谢。