我最近开始学习ruby,当我看到这行代码时正在做一些涉及数组的研究:
array.map!{ |i| i.is_a?(Integer) ? (i + number) : i }
我正在尝试概念化并更好地理解这一行的每个部分的含义。有人可以解释我是如何使用do end代替{}以及“?”来写出来的。之后(整数)和之后的“:”(i +数字)意味着什么?非常感谢!
答案 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
;结果将是一个新阵列。
块由{}
分隔,可以在不同的行显示do
和end
:
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
,则它只替换其索引。