Label - oder was besseres

06/02/2009 - 20:09 von Tony Lawetta | Report spam
Hatte heute auf der Arbeit ein Problem und habe den Code leider nicht
genau dabei. Tut aber nix zur Sache.

Das eine Problem war: Wie kann man bei geschachtelten Schleifen (hier
Array#each) aus der inneren das nàchste Element des àußeren "each"
springen. Hier vereinfacht mit erfundenen Feldern:

ldap_attrib = [ :vorn, :nachn ]

# Es wird über LDAP ein Ergebnis geliefert, und zwar als
# Array of Hashes (deren Werte wieder Arrays sind) wie z.B.:
# [
# { :cn => ['John Doe'], :nachn => ['Doe'] },
# { :cn => ['Ed Schleck'], :nachn => ['Schleck']}
# { :cn => nil, :nachn => ['Gibtsnicht'] }
# ]

PERSON: # So würde man in Perl ein Label setzen
people.each do |p|
ldap_attrib.each do |a|
next PERSON unless (a) # So würde man in Perl springen
puts a
end
end

1. Gibt es etwas àhnliches in Ruby (konnte nix finden)

2. Gibt es einen besseren Weg, zu prüfen, ob Elemente für ein ganzes
Array von Keys jeweils vorhanden sind?

Wenn jemand einen Tip hat ...

Danke
T.
 

Lesen sie die antworten

#1 Oliver Cromm
06/02/2009 - 23:53 | Warnen spam
* Tony Lawetta wrote:

Hatte heute auf der Arbeit ein Problem und habe den Code leider nicht
genau dabei. Tut aber nix zur Sache.

Das eine Problem war: Wie kann man bei geschachtelten Schleifen (hier
Array#each) aus der inneren das nàchste Element des àußeren "each"
springen. Hier vereinfacht mit erfundenen Feldern:

ldap_attrib = [ :vorn, :nachn ]

# Es wird über LDAP ein Ergebnis geliefert, und zwar als
# Array of Hashes (deren Werte wieder Arrays sind) wie z.B.:
# [
# { :cn => ['John Doe'], :nachn => ['Doe'] },
# { :cn => ['Ed Schleck'], :nachn => ['Schleck']}
# { :cn => nil, :nachn => ['Gibtsnicht'] }
# ]

PERSON: # So würde man in Perl ein Label setzen
people.each do |p|
ldap_attrib.each do |a|
next PERSON unless (a) # So würde man in Perl springen
puts a
end
end

1. Gibt es etwas àhnliches in Ruby (konnte nix finden)



Das sollte break sein:



["abc", "def", "ghi"].each do |word|
word.split(//).each do |letter|
break if letter == "e"
puts letter
end
end

=>
a
b
c
d
g
h
i



2. Gibt es einen besseren Weg, zu prüfen, ob Elemente für ein ganzes
Array von Keys jeweils vorhanden sind?



Mir ist nicht klar, was genau Du erreichen möchtest. Genau die Elemente
finden, für die die genannten Keys vorhanden sind und der Value ungleich
nil? Da wàre meine Idee:

arr.reject {|item| item.values_at(*keys).include?(nil)}

(values_at(key) gibt auch nil zurück, wenn der key nicht vorhanden ist)

There are two ways of constructing a software design. One way is to make
it so simple that there are obviously no deficiencies. And the other way
is to make it so complicated that there are no obvious deficiencies.
The first method is far more difficult. -- C. A. R. Hoare

Ähnliche fragen