新手问题 Ruby Array map! 使用问题

Kirisames · 2020年12月16日 · 最后由 xinyuewaisong 回复于 2021年01月02日 · 606 次阅读

需求

一个数组如:array = ["1","11","111"] ,现在我需要将这些字符串以前面添 0 的方式补成长度为 4 的字符串。

环境

kali 2020.3
ruby 2.7.1

代码

array.map! do |element|
  (4-(element.length)).times {element = "0" + element}
end

这个时候,array 数组的值是这个表达式的返回值,返回的是需要补充的次数。

修改

array.map! do |element|
  (4-(element.length)).times {element = "0" + element}
  element
end

用这种方法就能够满足我的需求

疑问

此时我思考,如果是返回值的话,那么我用 return 显式返回更方便我后面理解这块代码为何会有最后一行。

array.map! do |element|
  (4-(element.length)).times {element = "0" + element}
  return element
end

但是当我显式使用 return 时,数组只有且仅有第一个元素的补全值,这是为什么?

PS 需求是在数字的基础上补全 4 位,不够按 0 添加,我目前是使用字符串来操作。如果有更好的方法,或者是更加 Rubyish 的方法,欢迎一起讨论。

2.5.1 :003 > ['1', '11', '111'].map { |x| x.rjust(4, '0') }
 => ["0001", "0011", "0111"]

block 里面 next 相当于 continue, break 相当于 break, return 直接 return 了上层的方法

lithium4010 回复

补充记忆:

rjust => right-hand justified => 右对齐

0001
0011
0111
  1. (4-(element.length)).times {element = "0" + element} 最后返回的值是 .times 方法的值。
  2. return 返回的上下文是方法或者 Proc lambda,已经跨过了 block 的范围;block 里面显式返回用 next。

补充一下楼上,return 返回的上下文是方法或者 lambda(一种特殊的 Proc 对象)

楼上#5 对的,我记错了。

map! 是修改当前数组?

lithium4010 回复

受益匪浅

Rei 回复

原来如此,感谢指导

pynix 回复

是的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号