Любой способ получить заголовок или имя хэша и / или массива в ruby - PullRequest
0 голосов
/ 10 августа 2011

Так довольно просто, но я не могу найти ответ.

Скажем, у меня есть объект, выгруженный в YAML как таковой:

page: 
  page_url: http://www.stackoverflow.com/
  created_at: "2011-08-10T11:00:19Z"
  website_id: 1
  updated_at: "2011-08-10T11:00:19Z"
  id: 1
Hash

Я знаю из дампа, что это хеш с использованием .class и что заголовок страницы. Я могу ссылаться на любой из ключей, как вы это обычно делаете. Как, черт возьми, вы получили название или название хэша? и то же самое для массивов?


результаты object.methods

Hash

presence
zip
find_index
invert
silence_stderr
enum_slice
deep_merge
load
gem
require_dependency
extract!
minmax
encode64
rehash
debugger
methods
send
assert_valid_keys
replace
values_at
empty?
group_by
diff
taint
instance_variable_defined?
shift
stringify_keys
take
to_param
to_yaml
key?
find_all
update
silence_stream
as_json
singleton_class
keys
require
many?
min_by
each_cons
entries
to_hash
singleton_methods
instance_eval
require_library_or_gem
to_json
first
require_or_load
nil?
b64encode
take_while
select
deep_merge!
with_options
extractable_options?
exclude?
max_by
enum_cons
deep_symbolize_keys
protected_methods
instance_exec
display
sort
store
returning
tainted?
method
delete_if
include?
stringify_keys!
untaint
instance_of?
merge!
symbolize_keys
drop
equal?
suppress
reject
merge
minmax_by
sum
to_set
yaml_initialize
hash
private_methods
all?
sort_by
default_proc
to_query
silence_warnings
`
require_association
kind_of?
freeze
acts_like?
drop_while
eql?
indexes
html_safe?
collect
id
reverse_merge
slice
reject!
grep
each_value
instance_values
with_warnings
any?
public_methods
breakpoint
symbolize_keys!
object_id
is_a?
has_key?
cycle
indices
to_options
except!
map
member?
tap
type
fetch
with_indifferent_access
each_with_index
decode64
count
each_key
instance_variable_names
enable_warnings
one?
instance_variables
try
__id__
frozen?
suppress_warnings
clear
load_dependency
to_enum
to_yaml_properties
has_value?
to_a
respond_to?
each_with_object
each
taguri
inject
slice!
class
encode_json
reverse_update
length
enum_with_index
instance_variable_get
each_pair
copy_instance_variables_from
none?
taguri=
find
==
__send__
===
enum_for
min
to_options!
extend
value?
to_s
default
index_by
index
size
reduce
blank?
unloadable
to_yaml_style
default=
clone
reverse_each
decode_b
=~
instance_variable_set
detect
values
to_xml
max
each_slice
inspect
[]
class_eval
present?
duplicable?
reverse_merge!
except
partition
delete
[]=
dup

* На ключи и ключи

нельзя ссылаться по какой-либо причине. наблюдать

puts object.keys

возвращает

undefined method `keys' for nil:NilClass

puts object.key

возвращает

undefined method `key' for #<Hash:0x103aeb0b0>

Решение: вы, ребята, будете ненавидеть это. Я исправил проблему, запустив

sudo gem update

Без шуток. Обновил ruby ​​1.8.7 до 1.8.7 и все. задача решена. Я никогда не делал ничего сумасшедшего с моей установкой ruby, но, похоже, что-то там смешалось с хэшем. или, возможно, это была очень редкая ошибка. Я не могу найти ничего в следе обновления, который вызвал бы это. Спасибо всем, кто помог.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

«страница» - это просто ключ в хэше верхнего уровня.Вы всегда можете просто использовать Hash#keys, чтобы получить список имен верхнего уровня.В вашем случае это будет всего один элемент, поэтому:

x.keys.first == 'page'
=> true
0 голосов
/ 10 августа 2011

Хэши и массивы не имеют "заголовков".Хеши имеют ключи.: page является ключом в хэше, а object [: page] также является хешем.

Вы можете получить все ключи хеша, вызвав .keys

object.keys
=> [:key1, :key2, :key3]

Если выпытаясь выяснить, является ли объект Hash или Array, вы можете вызвать object.kind_of? (Hash), однако вам, скорее всего, не нужно этого делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...