首页 文章

结合红宝石中的符号

提问于
浏览
3

我有两个数组,一个带符号,另一个带字符串 .

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

    Array#product

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

    你的错误是因为你试图在 String (b)上调用 each ,因为你用 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
    
  • 0

    一个简单的方法是:

    a.product(b).map{|arr| arr.join("_").to_sym}
    #=> [:man_one, :man_two, :woman_one, :woman_two]
    
  • 4

    只是给出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]
    
  • 2

    在尝试实现预期输出时遇到一些问题:

    将b转换为String除了 "[\"one\", \"two\"]" 之外别无其他,这是不可迭代的,所以我猜这一切都搞糟了 .

    另一方面,你似乎正在尝试迭代a,然后迭代b,但是推向q右边的a元素的值加上对每个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

    嵌套循环上的另一个riff而不改变循环内的外部变量

    a = [:man, :woman]
    b = ["one", "two"]
    
    q = a.flat_map do |n|
      b.map do |w|
        "#{n}_#{w}".to_sym
      end
    end
    
    p q
    

相关问题