Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解do-end块中的ruby语法_Ruby_Arrays_Syntax - Fatal编程技术网

理解do-end块中的ruby语法

理解do-end块中的ruby语法,ruby,arrays,syntax,Ruby,Arrays,Syntax,我最近开始学习ruby,并在做一些涉及数组的研究时,看到了这行代码: array.map!{ |i| i.is_a?(Integer) ? (i + number) : i } 我试图概念化,更好地理解这条线的每一部分的含义。有人能解释一下我是如何用do end而不是{}来写这篇文章的吗?在(整数)后面的“?”和在(I+number)后面的“:”在单词中是什么意思?非常感谢 {}与do/end完全相同,?和:的工作方式类似于if/else块,因此代码也可以写成 array.map! do |i

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

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

我试图概念化,更好地理解这条线的每一部分的含义。有人能解释一下我是如何用do end而不是{}来写这篇文章的吗?在(整数)后面的“?”和在(I+number)后面的“:”在单词中是什么意思?非常感谢

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

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

结果将是一个元素数相同的数组,但每个元素都是原始数组中每个对应元素的映射结果,
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
执行块而返回的结果。因此,整个映射的结果是替换a中类
Integer
的每个元素带索引的rray加上
数字的任何变量(希望也是数值类的变量)。如果元素不是
整数
,则只替换为其索引。

感谢您的深入解释,它确实帮助我理解了代码行的每一部分!
array.map! do |i|
  if i.is_a?(Integer) then
     i + number
  else
     i
  end
end