如何"取消"Ruby数组?

jls*_*str 6 ruby arrays

我目前正在尝试转换这个ruby数组:

[5, 7, 8, 1]
Run Code Online (Sandbox Code Playgroud)

进入这个:

[[5], [7], [8], [1]]
Run Code Online (Sandbox Code Playgroud)

什么是最好的方式?

我现在这样做:

[5, 7, 8, 1].select { |element| element }.collect { |element| element.to_a }
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

警告:默认`to_a'将过时

我究竟做错了什么?你能告诉我如何做到这一点吗?

在此先感谢您的问候!

Mar*_*une 28

最短,最快的解决方案是使用Array#zip:

values = [5, 7, 8, 1]
values.zip # => [[5], [7], [8], [1]]
Run Code Online (Sandbox Code Playgroud)

另一种可爱的方式是使用transpose:

[values].transpose # =>  [[5], [7], [8], [1]]
Run Code Online (Sandbox Code Playgroud)

最直观的方式可能是@Thom建议的:

values.map{|e| [e] }
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 17

无点风格:

[5, 7, 8, 1].map(&method(:Array))
Run Code Online (Sandbox Code Playgroud)

  • @Jorg:这有点不同,因为我们正在做`Array(5)`,而不是`5.Array`.我很好奇这个成语是否对表现有害. (3认同)

Tho*_*ith 11

试试这个:

[5, 7, 8, 1].map {|e| [e]}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是正确的,尽管这个问题应该用不同的方式表达.当数组被展平时,所有维度都被解析为一个.没有办法知道最初的安排是什么(至少我想不到一个).您的答案的问题应该是"如何获取数组并在数组的zeroith元素中将每个元素替换为自身,例如[0,1]变为[[0],[1]]"或者某些东西更清楚......只是说当我看到这个话题时我就像'哇,不可能' (2认同)
  • @Thom:那是你正在谈论的`map`和`collect`,`select`是别的东西(在Smalltalk中也叫`select`,在其他一些语言中叫`filter`).例如参见http://smalltalk.gnu.org/blog/sblinn/list-comprehension-using-select-and-collect (2认同)

归档时间:

查看次数:

2948 次

最近记录:

13 年,5 月 前