理解 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
;结果将是一个新数组。
块由{}
分隔,可以用do
和end
分行表示:
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
,则仅用其索引替换它。
我最近开始学习 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
;结果将是一个新数组。
块由{}
分隔,可以用do
和end
分行表示:
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
,则仅用其索引替换它。