Ruby:如何将复杂格式的浮点数字符串转为浮点数组?
解决方法
直接用更简洁的逻辑就能实现需求:
def onset_string_to_array(onset) onset.tr('[]', '').split.map(&:to_f) end
原理说明
tr('[]', ''):移除字符串中的方括号,和你原本的处理逻辑一致。split:不带参数的split会自动识别任意空白字符(包括空格、换行、连续空格),直接把所有数字字符串拆成独立元素,不需要单独处理每行。map(&:to_f):将每个拆分后的字符串转换为浮点数,最终得到一维浮点数组。
你原有代码的问题
你原来的代码没得到预期结果,核心是Ruby的块绑定优先级问题:当你写onset_array.push *onset_lines.map do |line| ... end时,do...end块会被绑定给push方法而非map,导致map没有执行预期的转换,最终把每行原字符串直接存入了数组。
如果要修复原有代码,需要给map的块加上括号明确绑定关系,最后再把二维数组展平:
def onset_string_to_array(onset) onset = onset.tr('[]', '').strip onset_lines = onset.split("\n") onset_array = [] onset_array.push *(onset_lines.map do |line| line.split.map(&:to_f) end) onset_array.flatten end
不过显然第一种方法更简洁高效,无需额外处理换行和数组展平的步骤。
内容的提问来源于stack exchange,提问作者Seto
相关产品推荐
相关产品推荐

