复杂而有趣的Ruby注入方法。它有什么作用?

时间:2013-08-28 21:53:47

标签: ruby inject

我无法理解这种注入方法的最新进展。它来自之前版本的octokit gem 1.25.0

VALID_OPTIONS_KEYS = [
      :adapter,
      :faraday_config_block,
      :api_version,
      :api_endpoint,
      :web_endpoint,
      :status_api_endpoint,
      :login,
      :password,
      :proxy,
      :oauth_token,
      :client_id,
      :client_secret].freeze

这是行动

VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => send(k)) }
任何人都可以帮助我。我对可以解释的各种方式感兴趣。感谢

1 个答案:

答案 0 :(得分:2)

VALID_OPTIONS_KEYS包含所有符号方法名称。现在,行VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => send(k)) }将创建一个哈希,其中key将是符号方法的名称,值将是符号方法的结果。

非常类似于下面:

VALID_OPTIONS_KEYS = [
      :downcase,
      :upcase].freeze

VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => "aa".send(k)) }
# => {:downcase=>"aa", :upcase=>"AA"}

文档Enumerable#inject非常清楚,了解inject的工作原理。

  

如果指定一个块,那么对于枚举中的每个元素,块将传递一个累加器值(memo)和元素。如果指定了符号,则集合中的每个元素都将传递给命名的备忘录方法。在任何一种情况下,结果都将成为备忘录的新值。在迭代结束时,memo的最终值是方法的返回值。

所以我们在开头传递inject空哈希o。然后在块内部,每次使用方法Hash#merge传递哈希对象o,继续使用新的键/值对进行更新。其中 key 是数组VALID_OPTIONS_KEYS中的方法名称,值是方法调用的结果。

希望它会对你有所帮助!