Ruby中的隐式返回值作用域

Ruby中的隐式返回值作用域,ruby,return-type,implicit-declaration,Ruby,Return Type,Implicit Declaration,我使用一个自定义的include?方法来检查显式和隐式返回之间的差异。我知道,#每个都返回迭代的集合,因此我认为我需要将true/false隐式返回放在正确的位置,但当我这样做时,我会返回集合,我不确定要修改什么 def self.include?(array, search_item) array.each do |elem| if elem == search_item true end end end 下面是我正在检查的测试,但我不知道如何正确匹配回报

我使用一个自定义的
include?
方法来检查显式和隐式返回之间的差异。我知道,
#每个
都返回迭代的集合,因此我认为我需要将true/false隐式返回放在正确的位置,但当我这样做时,我会返回集合,我不确定要修改什么

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      true
    end
  end
end
下面是我正在检查的测试,但我不知道如何正确匹配回报。为什么它们不匹配,或者我应该如何理解隐含回报的范围

  result = MethodReturns.include?(numbers_array, 4)
  expect(result).to eq(true)

  result = MethodReturns.include?(numbers_array, 7)
  expect(result).to eq(false)

执行的最后一条语句提供返回值。each()循环中发生的最后一件事始终是循环的结束(除非您以某种方式中断循环,例如return,break):

因此,您的真值被丢弃,然后使用each()进行迭代,直到each()循环结束,正如您所知,当each()循环结束时,它返回左侧

下面是一个隐式返回true的方法示例:

def do_stuff()
  [1, 2, 3]. each do |num|
    #blah
  end

  true
end
each()方法仍然返回数组——但each()方法不是在do_stuff()方法中执行的最后一条语句

在您的示例中,您可以这样做:

但是,该解决方案会浪费资源,因为each()方法会在找到匹配项后继续迭代数组。例如,如果数组中有100万个元素,并且在数组的索引0处找到了匹配项,则each()方法将不必要地继续迭代剩余的99999个元素。另一方面,在找到匹配项时显式返回将终止循环


显式写入
返回val
从来都不是一个错误。随着您经验的增加,您可以在适当的时候删除return部分,向世界展示您对ruby的了解……但是偶尔省略
return
仍然会让您感到困惑。

您将希望更改为:

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
  return false
end

这是因为方法中的最后一条语句是返回值。在您的情况下,如果没有匹配项,您永远不会返回false。当您想要中断并立即停止其余的方法执行时,请确保添加
返回值

如果在
每个
块中使用显式
返回值
,到达该代码将导致立即返回值(停止迭代)。这是因为块的特性:

Ruby的块支持非本地返回,这意味着 块的行为与从块的原始属性返回的行为相同 上下文

因此,如果只使用显式
return
,代码应该可以正常工作:

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
end

您的代码正确,但您的解释不正确。循环中的
return
是至关重要的,否则
true
将被
每个
吞没,永远不会返回。我总是在需要基本突破执行方法时写入return,所以我从来没有想到这一点。感谢您的添加。@Max进一步说明:块返回的值是在块中执行的最后一个表达式。
每个
方法接收一个块,在这种情况下,如果当前元素是搜索项,则该块返回true,否则返回false。但是,这个问题是存在的,
each
方法忽略了块每次执行的输出,而是定义为返回调用each方法的数组。因此,由于
每个
方法调用都是该方法中的最后一个表达式,因此该数组由include的这个实现返回?
def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
  return false
end
def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
end