Подтвердить что ты не робот

Как я могу получить доступ к хэш-настройкам 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.

4b9b3361

Ответ 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