Настройки Ruby Sinatra JSON - PullRequest
       15

Настройки Ruby Sinatra JSON

0 голосов
/ 16 октября 2018

Я написал это расширение в Синатре:

#extension.rb
require 'sinatra/base'
require 'json'

    module Sinatra
      module Ibaf
        module Helpers

          def test
            payload = settings.my_json.dup
            payload["test"] << "DONE"
            puts payload
            "OK"
          end   

        end

        def self.registered(app)
          app.helpers Ibaf::Helpers
          app.set :my_json, JSON.parse('{"test":[]}')

          app.get "/" do
             test
          end
        end

      end   
      register Ibaf
    end

и myapp.rb

#app.rb
require 'sinatra'
require './extension.rb'

и работает как jruby -S app.rb -p 80

При первом вызове http://localhost переменная payload содержит один элемент "DONE".
Во втором вызове payload содержит два элемента, почему?
Я ожидаю, что settings.my_json.dup возвратит новый объект, почему модифицируется?

Это вывод:

== Sinatra (v2.0.0) has taken the stage on 80 for development with backup from T
rinidad
Deploying from C:/Users/adminlocale/Desktop as /
Initializing ProtocolHandler ["http-bio-127.0.0.1-80"]
Starting ProtocolHandler ["http-bio-127.0.0.1-80"]
{"test"=>["DONE"]}
127.0.0.1 -  [16/Oct/2018:17:08:42 +0200] "GET / " 200 2 0.1110

{"test"=>["DONE", "DONE"]}
127.0.0.1 -  [16/Oct/2018:17:08:51 +0200] "GET / " 200 2 0.0250

1 Ответ

0 голосов
/ 16 октября 2018

Вы копируете хеш.Это означает, что ваш payload имеет новый object_id, но payload["test"] по-прежнему указывает на тот же объект.

[2] pry(#<Sinatra::Application>)> settings.my_json["test"].object_id
=> 47444101678660
[3] pry(#<Sinatra::Application>)> settings.my_json.dup["test"].object_id
=> 47444101678660

Если вы хотите глубокое клонирование (есть несколько способов сделать это):

[5] pry(#<Sinatra::Application>)> payload = Marshal.load(Marshal.dump(settings.my_json))
=> {"test"=>[]}
[6] pry(#<Sinatra::Application>)> payload["test"].object_id
=> 70216811281680
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...