Ruby 变量在函数中无法正常工作

Posted

技术标签:

【中文标题】Ruby 变量在函数中无法正常工作【英文标题】:Ruby variable not working properly in function 【发布时间】:2021-06-13 10:42:54 【问题描述】:

我有这个功能:

def find_deleted_number(arr, mixed_arr)

    default = 0

    arr.each do |i|
        if mixed_arr.include?(arr[i]) == true
            default += arr[i]
        else 
            return arr[i]
        end
    end
    return default  
end

find_deleted_number([1,2,3,4,5], [3,4,1,5])
#=> 2 (as expected)

find_deleted_number([1,2,3,4,5,6,7,8,9], [1,9,7,4,6,2,3,8])
#=> 5 (as expected)

find_deleted_number([1,2,3,4,5,6,7,8,9], [5,7,6,9,4,8,1,2,3])
#=> nil (expected 45)

这个想法是让函数检查哪个数字在 arr 中,但不在 mix_arr 中。这一切都很好,但问题是当两个数组相同时,我希望它给我其中一个数组中每个值的总和(这就是我这样做default += arr[i] 的原因)。但结果是nil,我不太明白为什么。如果可能的话,我想了解它失败的原因。

【问题讨论】:

你可以使用sum来简化你的循环 您对这个案例有什么期望:find_deleted_number([1,2,3,4,5,6,7,8,9,9], [5,7,6,9,4,8,1,2,3])?注意重复的9。当然,如果这种情况是可能的输入。 【参考方案1】:

arr.each 迭代 arr 的元素,而不是索引。因此,您需要将arr[i] 更改为i

完整的答案是:

def find_deleted_number(arr, mixed_arr)
  default = 0

  arr.each do |i|
    if mixed_arr.include?(i)
      default += i
    else 
      return i
    end
  end

  default  
end

【讨论】:

【参考方案2】:

正如@yzalavin 所说,它失败的原因。

您还可以简化代码:

def find_deleted_number(arr, mixed_arr)
  return arr.sum if arr.sort == mixed_arr.sort

  (arr - mixed_arr).first
end

而@Stefan 提供了一个更短的单行:

(arr - mixed_arr).first || arr.sum

【讨论】:

更短:(arr - mixed_arr).first || arr.sum @Stefan Wow 令人印象深刻 :) 假设arr = [1,2]; mixed = [1,2,3]。然后arr.sort == mixed_arr.sort #=> false,所以返回(arr - mixed_arr).first #=> [].first #=> nil,不正确。 @CarySwoveland 是的,这在条件下有效:The idea is for the function to check which number is in arr but not in mixed_arr.

以上是关于Ruby 变量在函数中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

我的 Ruby Anagram 无法正常工作

动态生成的表单无法正常工作

jquery .ajax函数与Laravel-4无法正常工作

增量时间无法与 GLFW 正常工作

我的 LiveData 变量无法正常工作

xmlhttprequest 在函数中无法正常工作