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

时间:2015-05-08 17:45:22

标签: ruby-on-rails ruby httparty

@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

4 个答案:

答案 0 :(得分:4)

这是hash

  

Hash是一个类似字典的唯一键及其值的集合。也称为关联数组,它们类似于数组,但是当数组使用整数作为索引时,哈希允许您使用任何对象类型。

哈希非常类似于javascript中的对象文字。 最初的哈希使用了一种特殊的“hashrocket”语法:

hash = {
  :a => 1
}

Ruby 1.9为您的密钥全部symbols时引入了另一种语法形式。这看起来很像一个javascript对象文字(这可能不是偶然的):

hash = {
  a: 1,
  b: 2
}

与Javascript对象不同,Ruby Hashes仅使用方括号表示法:

hash[:a]

答案 1 :(得分:2)

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

转换为:

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

这是1.9中引入的新Hash语法

答案 2 :(得分:1)

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

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

如果您有兴趣,请阅读几篇文章:

http://ruby-doc.org/core-2.1.5/Hash.html - 红宝石哈希上的文件

https://softwareengineering.stackexchange.com/questions/187457/what-is-the-principle-of-least-astonishment - 这是一个很好的讨论,讨论不同的命名约定。

答案 3 :(得分:0)

代码创建一个哈希(就像在javascript中一样)并将其分配给options实例值。

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