syzygy333
syzygy333

Reputation: 123

Codecademy "converting between symbols and strings" ruby lesson

These are Codecademy's instructions:

We have an array of strings we'd like to later use as hash keys, but we'd rather they be symbols. Create a new array, symbols. Use .each to iterate over the strings array and convert each string to a symbol, adding those symbols to symbols.

This is the code I wrote (the strings array was provided):

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []
strings.each { |x| x.to_sym }
symbols.push(strings)

I know I'm probably doing multiple things wrong, but I've got through the ruby track this far with very little difficulty, so I'm not sure why this one is stumping me. Firstly, it's not converting the strings to symbols, and secondly, it's not pushing them to the symbols array.

Upvotes: 9

Views: 10217

Answers (5)

Kijana_kenn
Kijana_kenn

Reputation: 1

You have to store the new value as you iterate each value of the string, convert it to a symbol and then retun the value

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []
strings.each do |s|
  s = s.to_sym
  symbols.push(s)
end

Upvotes: 0

user2826912
user2826912

Reputation: 11

You can change your code to the following:

strings.each do |x|
x = x.to_sym
symbols.push(x)

Upvotes: 1

Rahul Deo
Rahul Deo

Reputation: 1

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]

symbols = Array.new
strings.each do |x|
    symbols.push(x.to_sym)
end

This should be a exact answer..

Upvotes: 0

mahemoff
mahemoff

Reputation: 46379

The to_sym alone wasn't doing anything useful; it was converting the string, but not storing it anywhere or using it later. You want to keep adding to symbols array.

strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []
strings.each { |s| symbols.push s.to_sym }

Or more elegantly, you can skip setting symbols = [] and just use map to create it in one line:

symbols = strings.map { |s| s.to_sym }

map will walk through each item in the array and transform it into something else according to the map function. And for simple maps where you're just applying a function, you can take it a step further:

symbols = strings.map &:to_sym

(That's the same as symbols = strings.map(&:to_sym), use whichever you find more tasteful.)

Upvotes: 16

Femaref
Femaref

Reputation: 61427

each iterates over strings, apply the block to every element. However, it doesn't return anything. You'll want to add to the symbols array in the block itself:

strings.each { |x| symbols.push(x.to_sym) }

However, you can generate a symbols array in one line as well:

symbols = strings.map { |x| x.to_sym }

Upvotes: 1

Related Questions