理解 do 结束块中的 ruby 语法

understanding ruby syntax inside do end block

我最近开始学习 ruby 并且正在做一些涉及数组的研究,当我看到这行代码时:

array.map!{ |i| i.is_a?(Integer) ? (i + number) : i }

我正在尝试概念化并更好地理解这条线的每一部分的含义。有人能解释一下我将如何使用 do end 而不是 {} 来写这个吗?“?”是什么?在 (Integer) 之后和 (i + number) 之后的“:”是什么意思?非常感谢!

{}和do/end完全一样,而?:就像一个if/else块,所以代码也可以这样写作为

array.map! do |i|
  if i.is_a?(Integer)
    i + number
  else
    i
  end
end
array.map! { |i| i.is_a?(Integer) ? (i + number) : i }

.map! 是 Ruby 中 Array 类型的方法。它表示 根据给定的块参数 映射数组的每个元素。 Ruby 中的块参数接受它自己的参数(用 |...| 分隔),因此您可以传入相关数组元素的值。在这种情况下,|i| 给出了一个块变量,i,表示正在计算的 array 的当前元素的值。

结果将是一个具有相同数量元素的数组,但每个元素都是原始数组中每个对应元素的映射结果,array。解释点(!)的意思是用结果替换 array 元素而不是用结果return 一个新数组。您也可以这样做,array.map {... 会产生相同的结果,但 不会改变 array;结果将是一个新数组。

{}分隔,可以用doend分行表示:

array.map! do |i|
  i.is_a?(Integer) ? (i + number) : i
end

使用 {}do-end 在行为上没有区别。

?: 是三元 if-then-else,就像在 C 中一样。所以 exp1 ? exp2 : exp3 说,if exp1 为真,则执行 exp2 否则执行 exp3。那么,以上等价于:

array.map! do |i|
  if i.is_a?(Integer) then
     i + number
  else
     i
  end
end

无论哪种情况,if-then-else表达式的value都是分支中执行的最后一条语句的值那被拿走了。这就是结果,然后,returned 用于执行给定元素 i 的块。因此,整个映射的结果是用索引 plus 替换数组中 class Integer 的每个元素,无论 number 是什么(希望也是一个数值变量 class)。如果该元素不是 Integer,则仅用其索引替换它。