Как я могу получить доступ к хэш-настройкам JavaScript?
Мне известно об этой функции, предоставляемой ActiveSupport.
h = ActiveSupport::OrderedOptions.new
h.boy = 'John'
h.girl = 'Mary'
h.boy # => 'John'
h.girl # => 'Mary'
Однако у меня уже есть большой хеш, и я хочу получить доступ к этому хэшу с использованием точечной нотации. Это то, что я пробовал:
large_hash = {boy: 'John', girl: 'Mary'}
h = ActiveSupport::OrderedOptions.new(large_hash)
h.boy # => nil
Это не сработало. Как я могу выполнить эту работу.
Я использую ruby 1.9.2
Update:
Извините, я должен был упомянуть, что я не могу использовать openstruct, потому что у него нет метода each_pair, который имеет Struct. Я не знаю ключей заранее, поэтому я не могу использовать openstruct.
Ответы
Ответ 1
OpenStruct должен хорошо работать для этого.
Если вы хотите увидеть, как это работает, или, возможно, настройте версию, начните с чего-то вроде этого:
h = { 'boy' => 'John', 'girl' => 'Mary' }
class << h
def method_missing m
self[m.to_s]
end
end
puts h.nothing
puts h.boy
puts h.girl
Ответ 2
Вы ищете OpenStruct
$ require 'ostruct'
$ large_hash_obj = OpenStruct.new large_hash
$ large_hash_obj.boy
=> "John"
Ответ 3
Я создал свой собственный камень для этого, и я использовал его во всех своих проектах. Кажется, нужно сделать то, что вам нужно:
large_hash = { boy: 'John', girl: 'Mary' }
r = Ribbon.wrap large_hash
r.boy
=> "John"
r.girl
=> "Mary"
r.keys
=> [:boy, :girl]
r.each_pair { |key, value| puts "#{key} => #{value}" }
boy => John
girl => Mary
Понравилась бы какая-то обратная связь.
Ответ 4
Если его просто небольшой script его безопасный для расширения Hash
сам
class Hash
def method_missing sym,*
fetch(sym){fetch(sym.to_s){super}}
end
end
method_missing
- это волшебный метод, который вызывается всякий раз, когда ваш код пытается вызвать метод, который не существует. Ruby перехватит неудачный вызов во время выполнения и позволит вам обрабатывать его, чтобы ваша программа могла изящно восстанавливаться. Вышеприведенная реализация пытается получить доступ к хешу, используя имя метода в качестве символа, используя имя метода в виде строки и, в конечном счете, не удается с ошибкой встроенного метода Ruby.
Для более сложного приложения, где добавление этого поведения ко всем хэшам может привести к повреждению других кодов или третьих камней, используйте модуль и расширьте каждый экземпляр
module H
def method_missing sym,*
fetch(sym){fetch(sym.to_s){super}}
end
end
the = { answer: 42 }
the.extend(H)
the.answer # => 42
и для большего удобства вы можете даже распространять модуль до вложенных хэшей
module H
def method_missing sym,*
r = fetch(sym){fetch(sym.to_s){super}}
Hash === r ? r.extend(H) : r
end
end
the = { answer: { is: 42 } }
the.extend(H)
the.answer.is # => 42