2011-06-21 8 views
6

Mogę utworzyć blok, który wyodrębni elementy mieszania i przekształci je w zmienne lokalne, ale zastanawiam się, czy natywna metoda już istnieje. Coś takiego:Czy istnieje ekwiwalent w języku Ruby do ekstraktu PHP?

extract({ :foo => 'bar', :foo2 => 'bar2' }) 
puts foo # 'bar' 
puts foo2 # 'bar2' 

Należy pamiętać, że klucze są prywatne, a zakres musi pozostać lokalny.

+0

Tak, smoki, prawda. W tym przypadku mniej smoków, ponieważ wszystkie prywatne i lokalne, i zajmujące się dość obrzydliwie hash var nazwy + ton członków. ekstrakt nie jest konieczny, ale miły. – glortho

Odpowiedz

7

można zbliżyć się:

bar, bar2 = h.values_at :foo, :foo2 

Albo przypuszczam mogliśmy Rozszerz Hash, aby wyodrębnić do zmiennych instancji:

class Hash 
    def extract o 
    each { |k, v| o.instance_variable_set '@' + k.to_s, v } 
    end 
end 

h.extract self 

p [@foo, @foo2] 
+0

Nie wiedziałem o tym - dobrze wiedzieć, dziękuję - ale przy pomocy kilku kluczy nie wystarczyłoby oszczędności, zwłaszcza, że ​​jeśli zmienisz nazwę klucza, to ją zmienisz dwa razy w tym zadaniu i ponownie, gdziekolwiek go używałeś. Można generalizować nazwy zmiennych lokalnych, ale nie jest to tym, na co mam nadzieję. Może nie być możliwe, w takim razie ... niech tak będzie! – glortho

+0

OK, zaktualizowałem go całkowicie zautomatyzowanym podejściem, ale narusza to regułę zasięgu lokalnego. – DigitalRoss

+0

Handy! Mam nadzieję, że to pytanie nigdy nie zostanie w pełni odpowiedział, ponieważ uczę się wszelkiego rodzaju sztuczek. :-) – glortho

1

Można użyć metody each iterację każdego key=>value pary:

{ :foo => 'bar', :foo2 => 'bar2' }.each do |key, value| 
    print key,"\t",value,"\n" 
end 

Wyjścia:

foo  bar 
foo2 bar2 
+0

Dzięki, Teddy. Wiem, że mogę to zrobić w bloku. Po prostu szukam metody krótkiej ręki. – glortho

Powiązane problemy