Ruby练习:计算给定范围之间的数组中的数字

ide*_*hed 0 ruby

因此,通过上述练习,在GitHub上找到了这个解决方案.

def count_between arr, lower, upper
  return 0 if arr.length == 0 || lower > upper
  return arr.length if lower == upper
  range = (lower..upper).to_a
  arr.select { |value| range.include?(value) }.length
end
Run Code Online (Sandbox Code Playgroud)

我理解前三行是什么意思,以及为什么他们返回他们所做的值.我想了解的是以下几行代码.

第4行(下面)将"range"定义为变量,并使用lower ... upper作为范围变量(刚发现你不需要在一个范围内放置一个整数值.'.to_a'是什么意思,似乎无法在ruby文档中找到它,它有什么作用?

 range = (lower..upper).to_a
Run Code Online (Sandbox Code Playgroud)

第5行(下面)使用的是Array#select方法,如果该值包含在此范围内,则选择此值,然后给出所有选定值的Array#length,但我不太明白A. what |值| 正在做什么,它意味着什么.B. range.include?(value)表示此值包含在我假设的范围内.

 arr.select { |value| range.include?(value) }.length
Run Code Online (Sandbox Code Playgroud)

Dar*_*tle 6

实际上,我简化了这个:

def count_between arr, lower, upper
  return 0 if lower > upper
  arr.count{|v| (lower..upper).include?(v)}
end
Run Code Online (Sandbox Code Playgroud)

to_a记录在这里 ; 它返回一个包含Range中每个元素的Array.但是,to_a在调用之前没有理由调用Range include?.

也没有理由对空数组进行特殊处理.

lower等于upper没有意义时返回数组的长度.

value是为块调用的值赋予的名称.我认为v对于这样一个微不足道的案例来说,简单就更好了.

select为每个值调用块arr并返回一个包含块返回的元素的新Array true,因此新Array的长度是匹配值的数量.但是,count存在,并且更有意义使用,因为计数是我们所关心的.

更新:正如@steenslag在评论中指出的那样,可比较#之间?可以使用而不是创建要调用的Range,这样就include?不需要确保lower小于或等于upper:

def count_between arr, lower, upper
  arr.count{|v| v.between?(lower, upper)}
end
Run Code Online (Sandbox Code Playgroud)