这段看起来像 JavaScript 对象的代码有什么作用?

What does this code, that looks like JavaScript object do?

@options = { query: {site: service, page: page} }

这是做什么的?在 javascript 中,我认为是对象定义,但我无法在 ruby 中找到它到底是什么。这将是完整的代码:

class StackExchange
  include HTTParty
  base_uri 'api.stackexchange.com'

  def initialize(service, page)
    @options = { query: {site: service, page: page} }
  end

  def questions
    self.class.get("/2.2/questions", @options)
  end

  def users
    self.class.get("/2.2/users", @options)
  end
end

该代码创建一个散列(如 javascript 中)并将其分配给 options 实例值。

> options = { query­: {site­: :serv­ice, page:­ :page­} }
=> {:query=>{:site=>:service, :page=>:page}}
> options.cl­ass
=> Hash
@options = { query: {site: service, page: page} }

转换为:

@options = {
  :query => {
    :site => service, 
    :page => page
  }
}

这是 1.9 中引入的新哈希语法

@options 是一个带有嵌套哈希的哈希文字。实例化时 StackExchange class 需要两个参数,一个页面和一个服务。

如果您要调用 @options[:query],它将 return {site­: :serv­ice, page:­ :page­} 的内部散列。这只是一种以帮助用户理解的方式存储不同数据的组织方式。

有兴趣读几篇:

http://ruby-doc.org/core-2.1.5/Hash.html - ruby 散列

上的文档

https://softwareengineering.stackexchange.com/questions/187457/what-is-the-principle-of-least-astonishment - 这是关于不同命名约定如何形成的很好的讨论。

这是一个 hash

A Hash is a dictionary-like collection of unique keys and their values. Also called associative arrays, they are similar to Arrays, but where an Array uses integers as its index, a Hash allows you to use any object type.

散列很像 javascript 中的对象文字的用途。 最初哈希仅使用特殊的 "hashrocket" 语法:

hash = {
  :a => 1
}

Ruby 1.9 引入了另一种语法形式,当你的键都是 symbols 时。它看起来很像一个 javascript 对象文字(这可能不是偶然的):

hash = {
  a: 1,
  b: 2
}

不同于 Javascript 对象 Ruby 哈希仅使用方括号表示法:

hash[:a]