对to_json中Ruby符号的困惑

时间:2017-12-05 04:25:09

标签: ruby-on-rails ruby

我正在通过一个Rails udemy课程,现在正在触摸红宝石的部分(我没有经验,所以这对我来说都是新的)。

在这一部分基本上从权限文件中获取“权限”并将其放入“用户json”。

require 'json'

class User


  attr_accessor :email, :name, :permissions 

  def initialize(*args)
    @email = args[0]
    @name = args[1]
    @permissions = User.permissions_from_template

  end

  def self.permissions_from_template
    file = File.read 'user_permissions_template.json'
    JSON.load(file, nil, symbolize_names: true)
  end

  def save
   self_json = {email: @email, name: @name, permissions: @permissions}.to_json
   open('users.json', 'a') do |file|
     file.puts self_json
   end
  end
end

有一个简单的runner.rb文件可以创建用户并对其进行初始化,但这不是我的问题。基本上我的问题是self_json = {email: @email, name: @name, permissions: @permissions}.to_json

我已经阅读了to_json API并且它很简单,但我看到的每个ruby对象示例都是这样的:{:email => @email, :name => @name, :permissions => @permissions},除了用{{1替换@符号}}

我对"strings"@variable的变量类型感到困惑。

我们是否因为使用:variable变量或?

而未使用:var => @whatever

1 个答案:

答案 0 :(得分:1)

它与从实例变量而不是字符串中获取的值无关;所有与它有关的是键是符号。

旧Ruby只有一个对象文字语法,每个键/值对

key => value

e.g。

{ "foo" => "bar", 2 => 4, :name => "value" }

其中"foo"是字符串键,2是整数键,:name是符号键。

然而,发现符号键经常使用,尤其是作为(然后从语言中遗漏)关键字参数的替代功能:

link_to "Delete", thing, :method => :delete, :data => { :confirm => "Sure?" }

实际上是

的快捷方式
link_to("Delete", thing, { :method => :delete, :data => { :confirm => "Sure?" } })

为了使这种结构更简洁,更直观地使用关键字,我们开发了一种新的语法作为快捷方式,特别是对于符号的键,其中

key: value

是旧的但相同的替代

:key => value

所以上面的哈希可以写成

{ "foo" => "bar", 2 => 4, name: "value" }

(虽然在这种情况下我不推荐它,因为混合这两种风格有点蠢。)

使用这种新语法,可以编写上述命令:

link_to "Delete", thing, method: :delete, data: { confirm: "Sure?" }

因此,如果你写

,绝对没有区别
{ :email => @email, :name => @name, :permissions => @permissions }

{ email: @email, name: @name, permissions: @permissions }

目前,后者是首选,因为它更短且更易读。但是,在许多情况下,如果代码自Ruby-1.9之前就已存在,那么人们仍然可以找到旧的语法。