理解ruby语法里面的do end block

时间:2015-04-07 19:26:46

标签: ruby arrays syntax

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

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

我正在尝试概念化并更好地理解这一行的每个部分的含义。有人可以解释我是如何使用do end代替{}以及“?”来写出来的。之后(整数)和之后的“:”(i +数字)意味着什么?非常感谢!

2 个答案:

答案 0 :(得分:1)

{}与do / end完全相同,?:的工作方式类似于if / else块,因此代码也可以写为

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

答案 1 :(得分:1)

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

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

结果将是一个具有相同数量元素的数组,但每个元素将是原始数组中array中每个对应元素的映射结果。解释点(!)表示用结果替换 array元素,而不是返回带有结果的新数组。您也可以这样做,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说,如果exp1是真的,那么执行exp2否则执行exp3 。因此,上述内容相当于:

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

在任何一种情况下, if-then-else 表达式的是在分支中执行的最后一个语句的值。然后,返回执行给定元素i的块的结果。因此,整个映射的结果是用它的索引 plus 替换数组中类Integer的每个元素,而不管number是什么(希望也是一个数字变量)类)。如果元素不是Integer,则它只替换其索引。