我有一个这样的哈希:
h = { "key1" => { "key2" => "value"}, "key3" => "value3"}
如果我尝试访问h.key1
它不会让我,但如果我这样做h["key1"]
会。
但是当我使用会话哈希时,我可以编写以下代码而不会出错:
@session = session["omniauth"]
@session.data
我什么时候可以通过方法访问键,什么时候可以像数组一样访问?
我有一个这样的哈希:
h = { "key1" => { "key2" => "value"}, "key3" => "value3"}
如果我尝试访问h.key1
它不会让我,但如果我这样做h["key1"]
会。
但是当我使用会话哈希时,我可以编写以下代码而不会出错:
@session = session["omniauth"]
@session.data
我什么时候可以通过方法访问键,什么时候可以像数组一样访问?
您只能使用方法访问哈希值h["key1"]
(不使用其他修饰符)。
@session.data
起作用的原因是它@session
不是 的实例Hash
,而是它的实例OmniAuth::AuthHash
支持这两种方法来访问值。
因此,这取决于您正在使用的对象的类型。
您可以在 OpenStruct 的帮助下通过点符号访问哈希键
require 'ostruct'
h = { "key1" => { "key2" => "value"}, "key3" => "value3"}
open_struct = OpenStruct.new(h)
p open_struct.key1
我希望它可以帮助你解决你的问题
您能够从会话对象访问键值的原因是有人在其[]
上定义了方法。
如果你想在你的哈希上访问 h.key1,使用 OpenStruct:
h = OpenStruct({ "key1" => { "key2" => "value"}, "key3" => "value3"})
这将返回以下结果:
h.key1 # { "key2" => "value }
h.key3 # "value3"