Ruby on rails Ruby:如果引发异常,则跳过循环中的元素

Ruby on rails Ruby:如果引发异常,则跳过循环中的元素,ruby-on-rails,ruby,loops,ruby-on-rails-4,rubocop,Ruby On Rails,Ruby,Loops,Ruby On Rails 4,Rubocop,我有以下方法: def fetch_something @fetch_something ||= array_of_names.inject({}) do |results, name| begin results[name] = fetch_value!(name) rescue NoMethodError, RuntimeError next end results end end 其目的是:它为可能引发错误的给定名称获取一

我有以下方法:

def fetch_something
  @fetch_something ||= array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError
      next
    end

    results
  end
end
其目的是:它为可能引发错误的给定
名称
获取一个值,在这种情况下,它将忽略
名称
,然后尝试下一个

虽然这很好,但我从Rubocop得到一个错误,它说:

Lint/NextWithoutAccumulator:将next与中的累加器参数一起使用 减少

通过谷歌搜索该错误,我发现它说不要忽略累加器,这将导致一个如下所示的方法:

def fetch_something
  @fetch_something ||= array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError
      next(name)
    end

    results
  end
end
def fetch_something
  @fetch_something ||= @array_of_names.each_with_object({}) do |name, results|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError, KeyError
      # error handling
    end
  end
end
问题是,这种改变打破了其他工作方法。有没有办法解决这个问题

更新:演示示例:
array_of_names = ['name1','name2','name3']

def fetch_value!(name)
  # some code that raises an error if the name doesn't correspond to anything
end

fetch_something

# => {'name1' => {key1: 'value1', ...}, 'name3' => {key3: 'value3', ...}}
# 'name2' is missing since it wasn't found durcing the lookup

只需将每个_与_对象一起使用即可

def fetch_something
  @fetch_something ||= array_of_names.each_with_object({}) do |name, results|
    results[name] ||= begin
                        fetch_value!(name)
                      rescue NoMethodError, RuntimeError
                      end
  end
end

只需将每个_与_对象一起使用即可

def fetch_something
  @fetch_something ||= array_of_names.each_with_object({}) do |name, results|
    results[name] ||= begin
                        fetch_value!(name)
                      rescue NoMethodError, RuntimeError
                      end
  end
end

使用您的示例代码,似乎
next(results)
确实为我解决了这个问题。我使用了一些抛出
keyrorm
的测试代码,而不是
NoMethodError
RuntimeError
,但想法仍然是一样的:

@array_of_names = ['name1','name2','name3']

def fetch_value!(name)
  {'name1' => 'n1', 'name3' => 'n3'}.fetch(name)
end

def fetch_something
  @fetch_something ||= @array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError, KeyError
      next(results)
    end

    results
  end
end

p fetch_something
此代码输出:

{"name1"=>"n1", "name3"=>"n3"}
此外,我也同意@Аззззззззззззззззззззз107。因此,我首选的
fetch\u something
实现可能更像这样:

def fetch_something
  @fetch_something ||= array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError
      next(name)
    end

    results
  end
end
def fetch_something
  @fetch_something ||= @array_of_names.each_with_object({}) do |name, results|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError, KeyError
      # error handling
    end
  end
end

请注意,在我的示例中,
begin
/
end
块不在
results[name]
的赋值范围内,这与@А敪敪敪敪敪敪敪敪敪敪敪敪敪敪敪敪敪敪确实为我解决了这个问题。我使用了一些抛出
keyrorm
的测试代码,而不是
NoMethodError
RuntimeError
,但想法仍然是一样的:

@array_of_names = ['name1','name2','name3']

def fetch_value!(name)
  {'name1' => 'n1', 'name3' => 'n3'}.fetch(name)
end

def fetch_something
  @fetch_something ||= @array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError, KeyError
      next(results)
    end

    results
  end
end

p fetch_something
此代码输出:

{"name1"=>"n1", "name3"=>"n3"}
此外,我也同意@Аззззззззззззззззззззз107。因此,我首选的
fetch\u something
实现可能更像这样:

def fetch_something
  @fetch_something ||= array_of_names.inject({}) do |results, name|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError
      next(name)
    end

    results
  end
end
def fetch_something
  @fetch_something ||= @array_of_names.each_with_object({}) do |name, results|
    begin
      results[name] = fetch_value!(name)
    rescue NoMethodError, RuntimeError, KeyError
      # error handling
    end
  end
end

请注意,在我的示例中,
开始
/
结束
块不在
结果[名称]
的赋值范围内,这与@Ацццццццццццццццццццц109相反?@user12341234这也会破坏它。也许您可以显示示例输入/输出来衡量预期行为?@user12341234添加了exampleSeverin,请参阅@user12341234答案。我不知道,在结果哈希中不需要没有值的键。不如试试
next(results)
怎么样?@user12341234这也会破坏它。也许你可以显示示例输入/输出来衡量预期的行为?@user12341234添加了exampleservin,请参阅@user12341234答案。我不知道,结果哈希中不需要没有值的键。这也破坏了它的原始功能。这也破坏了它的原始功能。谢谢你的回复!谢谢你的回复!