Объединение символов в рубине - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть два массива, один с символами, а другой со строками.

a = [:man, :woman]
b = ["one", "two"]

Я пытаюсь объединить каждый символ с каждой строкой в ​​массиве так, чтобы вывод был:

[:man_one, :man_two, :woman_one, :woman_two]

Я пытался

b = b.to_s
q = []
a.each do |n|
  q.push (n.to_s + b.each {|w| "_" + w}).to_sym
end
p q

Но это дает мне ошибку.Как я могу создать новые символы?

Ответы [ 5 ]

0 голосов
/ 11 декабря 2018

Просто приведу еще один пример https://ruby -doc.org / core-2.5.3 / Array.html # method-i-product , пропускающий блок:

res = []
a.product(b){ |e| res << e.join('_').to_sym }
res #=> [:man_one, :man_two, :woman_one, :woman_two]
0 голосов
/ 10 декабря 2018

Простой способ заключается в следующем:

a.product(b).map{|arr| arr.join("_").to_sym}
#=> [:man_one, :man_two, :woman_one, :woman_two]
0 голосов
/ 10 декабря 2018

У вас есть некоторые проблемы при попытке получить ожидаемый результат:

Преобразование b в строку не дает вам ничего, кроме "[\"one\", \"two\"]", что не может быть повторено, поэтому я предполагаю, что это все испортит.

С другой стороны, кажется, что вы пытаетесь выполнить итерацию по a, затем выполнять итерацию по b, но, нажимая q на правое значение элементов a в String плюс вызов каждого в b, кажется, вы получаетеничего.

С небольшой настройкой вы можете сделать эту работу:

a = [:man, :woman]
b = ["one", "two"]
q = []

a.each do |n|
    b.each do |w|
        q << ("#{n}_#{w}").to_sym
    end
end

p q
# [:man_one, :man_two, :woman_one, :woman_two]
0 голосов
/ 10 декабря 2018

Еще один рифф на вложенном цикле без изменения внешней переменной внутри циклов

a = [:man, :woman]
b = ["one", "two"]

q = a.flat_map do |n|
  b.map do |w|
    "#{n}_#{w}".to_sym
  end
end

p q 
0 голосов
/ 10 декабря 2018

Посмотрите на Массив # product

a = [:man, :woman]
b = ["one", "two"]
a.product(b).map { |arr| arr.join('_') }.map(&:to_sym)

Ваша ошибка в том, что вы пытаетесь вызвать each для String (b), потому что вы преобразовали его с помощьюto_s на несколько строк вверх.

Если вы хотите сделать это с временной переменной, q, вы можете написать это так:

a=[:man, :woman ]
b=["one", "two"]
q=[]

a.each do |tmp_a|
  b.each do |tmp_b|
    q.push((tmp_a.to_s + '_' + tmp_b).to_sym)
  end
end

puts q
...