"123", "id2" => "456"} 现在是命令: puts params['id'] -6ren">
gpt4 book ai didi

ruby - 使用符号读写 Sinatra 参数,例如参数[:id]

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:35 25 4
gpt4 key购买 nike

我的表单通过 POST 接收数据。当我执行 puts params 时,我可以看到:

{"id" => "123", "id2" => "456"}

现在是命令:

puts params['id']    # =>  123
puts params[:id] # => 123

params['id'] = '999'
puts params # => {"id" => "999", "id2" => "456"}

但是当我这样做的时候:

params[:id] = '888'
puts params

我明白了

{"id" => "999", "id2" => "456", :id => "888"}

在 IRB 中它工作正常:

params
# => {"id2"=>"2", "id"=>"1"}

params[:id]
# => nil

params['id']
# => "1"

为什么我可以使用 :id 读取值,但不能使用它设置值?

最佳答案

Ruby 中的散列允许将任意对象用作键。由于字符串(例如 "id")和符号(例如 :id)是不同类型的对象,因此散列可能同时具有相同的字符串和符号作为键无冲突的视觉内容:

irb(main):001:0> { :a=>1, "a"=>2 }
#=> {:a=>1, "a"=>2}

这与 JavaScript 截然不同,在 JavaScript 中,对象的键始终是字符串。

因为 Web 参数(无论是通过 GET 还是 POST)始终是字符串,Sinatra 有一个“便利”功能,允许您使用符号请求参数,它会在查找关联值之前将其转换为字符串。它通过使用自定义 default_proc 来实现这一点,该 default_proc 在查找不存在的值时调用 to_s

这是 current implementation :

def indifferent_hash
Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
end

但是,它没有为 []=(key, val) 方法提供自定义实现,因此您可以设置符号而不是字符串。

关于ruby - 使用符号读写 Sinatra 参数,例如参数[:id],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com