Arrays 将Ruby数组字符串转换为整数数组

Arrays 将Ruby数组字符串转换为整数数组,arrays,ruby,string,integer,Arrays,Ruby,String,Integer,我有一个id号数组(从技术上讲是一个字符串) ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" 我想将ID做成如下所示的数组: ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 我发现唯一的方法就是使用地图 id_numbers = ids.split(/,\s?/).map(&:to_i) 但是,这会删除数组中的第一个数字,并将其替换为0 id_numbers = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10

我有一个id号数组(从技术上讲是一个字符串)

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
我想将ID做成如下所示的数组:

ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我发现唯一的方法就是使用地图

id_numbers = ids.split(/,\s?/).map(&:to_i)
但是,这会删除数组中的第一个数字,并将其替换为0

id_numbers = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

有没有更好的方法将字符串数组转换为常规数组?

因为这实际上是JSON格式的,所以答案很简单:

require 'json'

id_json = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

ids = JSON.load(id_json)

您的解决方案“删除”第一个数字的原因是因为您拆分的方式。系列中的第一个“数字”实际上是
“[1”
,对于Ruby来说,它不是一个数字,因此默认情况下会转换为0。

因为这实际上是JSON格式的,所以答案很简单:

require 'json'

id_json = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

ids = JSON.load(id_json)

您的解决方案“删除”第一个数字的原因是因为您拆分的方式。系列中的第一个“数字”实际上是
“[1”
,对于Ruby来说它不是数字,因此默认情况下会转换为0。

如果您不希望使用
JSON

ids.scan(/\d+/).map(&:to_i)
  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

如果
ids
可能包含负整数的字符串表示形式,如果不希望使用
JSON
,请将正则表达式更改为
/-?\d+/

ids.scan(/\d+/).map(&:to_i)
  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

如果
ids
可能包含负整数的字符串表示形式,请将正则表达式更改为
/-?\d+/

以总结:由于字符串开头的非数字字符,数组中的第一个元素是
0

p '[1'.to_i         #=> 0
也许有更好的方法来接收原始字符串。如果没有其他方法来接收该字符串,您只需去掉第一个字符,您自己的解决方案即可:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids[1..-1].split(",").map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]
的和的解决方案工作得非常好。或者:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids.tr("^-0-9", ' ').split.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]

请记住,
&:
最早出现在Ruby 1.8.7中。

总结一下:由于字符串开头的非数字字符,数组中的第一个元素是
0

p '[1'.to_i         #=> 0
也许有更好的方法来接收原始字符串。如果没有其他方法来接收该字符串,您只需去掉第一个字符,您自己的解决方案即可:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids[1..-1].split(",").map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]
的和的解决方案工作得非常好。或者:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids.tr("^-0-9", ' ').split.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]


请记住,
&:
最早出现在Ruby 1.8.7中。

不是“技术上”,它是一个字符串,根本不是数组。为什么不干脆创建一个数组呢?
eval id
是一种方法。使用时必须小心(出于安全原因),但这是一种基本的Ruby方法。@CarySwoveland使用
eval
就像坐在闪电风暴中的山顶上。这从来都不是一个好计划,很难安全地完成。@tadman,我喜欢这个类比,如果是一把钢椅,而这个人戴着一顶帽子,那就更好了。不是“技术上”,它是一个字符串,根本不是数组。为什么不创建一个数组呢?
eval id
是一种方法。使用时必须小心(出于安全原因),但这是一种基本的Ruby方法。@CarySwoveland使用
eval
就像坐在闪电风暴中的山顶上。这从来都不是一个好计划,而且很难安全完成。@tadman,我喜欢这个类比,如果是一把钢椅,而这个人戴着一个帽子,那就更好了。这正是我所需要的……谢谢!如果这个答案正确的话如果您的答案是正确的,请记住单击答案顶部旁边的复选标记图标,确认这是获奖答案,并将其移至顶部(并对作者的声誉评级进行评分;)我很欣赏绿色,但我总是建议那些新手在做出选择之前至少等待几个小时。快速选择可能会阻碍其他答案,而且,在我看来,对那些仍在准备答案的人来说是不礼貌的。如果你觉得比我的答案更有用,可以自由删除你的选择,然后选择另一个答案。我这与“菲利普的建议”并不矛盾,因为我只讨论了AsKer什么时候应该考虑选择的问题。卡里斯沃夫兰德看了一下我的答案。你需要调整一下自己的位置。“卡里斯沃夫兰,谢谢,现在绿色支票已经被删除了。还是新的,所以我不太熟悉这样的礼仪:”这个伤口。正是我所需要的…谢谢!如果这个答案是你想要的,请记得单击答案顶部旁边的复选标记图标,确认这是获胜的答案,并将其移动到顶部(并对作者的声誉评级进行评分;)我很欣赏绿色,但我总是建议那些新手在做出选择之前至少等待几个小时。快速选择可能会阻碍其他答案,而且,在我看来,对那些仍在准备答案的人来说是不礼貌的。如果你觉得比我的答案更有用,可以自由删除你的选择,然后选择另一个答案。我这与“菲利普的建议”并不矛盾,因为我只讨论了AsKer什么时候应该考虑选择的问题。“CysSWoValand看我的答案。你需要调整一下你的意思。”CySwitoValand谢谢,绿色支票现在已经被删除了。还是新的,所以我不太熟悉这样的礼仪:)呃,虽然该解决方案确实能挑出许多部分,但它并没有检测到任何可能重要的问题。它会愉快地将
中的“无效文档请勿读取错误”解析为
[19]
。谢谢你的快速回复。我尝试了你的JSON修复,然后我开始在我的代码中遇到一些其他问题。Cary的建议对我的需要来说更加简单有效,所以我可能会同意。:@lacostenycoder JSON与Ruby标准库捆绑在一起,所以它是核心。@lacostenycoder it简介ces未指明的“问题”我无法解决,否则我会解决。一般来说,当你有JSON数据时,你会使用JSON解析器,除非你有不起作用的特定原因。Ruby标准库是为了方便起见而提供的,没有理由不使用它,因为根据非常狭窄的定义,它不是“核心”。