如何在ruby中使用with_index映射数组?

时间:2015-06-26 13:49:01

标签: ruby-on-rails arrays ruby mapping

我有以下用于映射n-D数组的代码。如果输入为[[C, "O"], [C, "O"], [C, "#"], [C]],则输出为"COCOC#C"。我希望输出为C(O)COC#C这是当第一个数组中有两个元素时第二个元素应该在括号中。我使用了以下代码,我只是无法实现with_index函数的使用。

def format2smi
  # return a Smiles compliant chemical name as a string

  map do |element|
    format_step(element)
  end.join('')    #.join(')')

end # format2smi

protected

def format_step(e)
  e.map.with_index do |x,i|

    if x.is_a?(Array)

X = “(” + X [1] + “)”

"(#{ format_step(x) })" # calling the same function
    else  
      x.to_s # convert to string and return
    end
  end.join('')   #gsub("", "(").gsub("", ")") # map returns an array of strings, join
end

2 个答案:

答案 0 :(得分:1)

如果你只需要在第一个元素上使用括号,那就足够了:

array = [['C', 'O'], ['C', 'O'], ['C', '#'], ['C']]

array.first[1] = "(#{array.first[1]})" if array.first.size == 2
array.join # => "C(O)COC#C"

答案 1 :(得分:0)

我已经解决了这个问题。我这么傻。 :/

 def format_step(e)
  e.map.with_index do |x,i|

    if x.is_a?(Array)
      "(#{ format_step(x) })" # calling the same function
    else  
      if i ==0
        x.to_s
      else
       "("+x.to_s+")"
      end
      # convert to string and return
    end
  end.join('')
end