From: Safas Khkjh on
Hi,
I have a hash;

cars{ "car0" => "bmw", "car1" => "seat", "car3" => "mercedes", "car4" =>
"renault"}

What I want is to extract just the values of car0 and car3.

Is there a way instead of doing cars.each_value of doing
cars.each_value[0,3]?

Thank you in advance.

Ryan
--
Posted via http://www.ruby-forum.com/.

From: Brian Candler on
Safas Khkjh wrote:
> I have a hash;
>
> cars{ "car0" => "bmw", "car1" => "seat", "car3" => "mercedes", "car4" =>
> "renault"}
>
> What I want is to extract just the values of car0 and car3.
>
> Is there a way instead of doing cars.each_value of doing
> cars.each_value[0,3]?

[cars["car0"], cars["car3"]]

I'm not sure what you would want [0,3] to do. For an Array, that would
mean start at 0th element, count for 3 elements, i.e. would give you
elements 0,1 and 2.

However, hashes are not indexed by integers. It's a property of hashes
in ruby 1.9 (only) that they maintain their insertion order when
iterating, but you still can't access the nth item directly.

So perhaps you want to use an Array instead:

>> cars = ["bmw", "seat", "mercedes", "renault"]
=> ["bmw", "seat", "mercedes", "renault"]
>> cars.values_at(0,3)
=> ["bmw", "renault"]
--
Posted via http://www.ruby-forum.com/.

From: Luc Heinrich on
On 23 juin 2010, at 11:23, Safas Khkjh wrote:

> Hi,
> I have a hash;
>
> cars{ "car0" => "bmw", "car1" => "seat", "car3" => "mercedes", "car4" =>
> "renault"}
>
> What I want is to extract just the values of car0 and car3.

cars.values_at("car0", "car3")
# => ["bmw", "mercedes"]

--
Luc Heinrich - luc(a)honk-honk.com


From: Brian Candler on
Update: if you are interested at the values for particular keys, then
you can also do

>> cars = { "car0" => "bmw", "car1" => "seat", "car3" => "mercedes", "car4" =>
"renault"}
>> cars.values_at("car0","car3").each { |c| puts c }
bmw
mercedes
=> ["bmw", "mercedes"]

If you really want to rely on the insertion order, which I'd strongly
recommend against even under ruby 1.9, there's a brute-force way:

cars.each_value.with_index do |c,i|
next unless [0,3].include?(i)
puts c
end

Note that this will give you bmw and renault, because it ignores the
keys completely.
--
Posted via http://www.ruby-forum.com/.

From: Safas Khkjh on
Brian Candler;

Thank you very much! The following was exactly what I needed;
>> cars.values_at("car0","car3").each { |c| puts c }

--
Posted via http://www.ruby-forum.com/.