Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby类单例方法返回self,为什么?_Ruby - Fatal编程技术网

Ruby类单例方法返回self,为什么?

Ruby类单例方法返回self,为什么?,ruby,Ruby,我一直在使用两个Ruby库(Hashicorp的Vault)和(WeAreFarmGeek的外交官),它们使用单例类范例,其中类本身是访问底层客户机函数的通用方式。在像Chef这样的框架中,我看到了这一点的好处,因为一旦正确配置了类,所有的烹饪书都可以使用它 我想了解如何做到这一点,并且已经阅读并非常了解至少ruby vault代码在做什么。然而,有一行代码我无法理解它的功能。我希望这里有人能给我解释一下 如果您查看下面来自()的代码片段,您将看到当需要库时,设置 方法,该方法“创建”一个新的客

我一直在使用两个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的一种方法。感谢您花时间查看并回复。非常感谢。