红宝石中模数法的误差

时间:2016-12-07 20:12:39

标签: ruby modulus

我正在尝试编写一个方法,该方法将数组作为参数,并返回参数中具有偶数索引号和偶数值的数字数组。我不知道为什么,但它在第5行给出了错误“未定义的方法%”。有人可以解释我如何解决这个问题吗?

def odd_value_and_position(array)
    newArray=[] #create new array
    i=0 #i=0
    while i <= array.length #loop while
        newArray.push(array[i]) if array[i] % 2 != 0
        i = i + 2
    end

    return newArray
end

puts odd_value_and_position([0,1,2,3,4,5])

3 个答案:

答案 0 :(得分:3)

另一种方法:

def evens arr
  arr.select.with_index { |e,i| e.even? && i.even? }
end

evens [0,1,2,3,4,5] #=> [0,2,4]

答案 1 :(得分:1)

source.Rows.Add(new object[] { "", "Std. Deviation"}.Concat(sd.StdDev.Values.Cast<object>().ToArray()).ToArray()); 等于i时,array.length为零。

什么是array[i]?这是未定义的。

nil % 2

由于Ruby数组中的第一个元素为0作为索引,我不确定您是否得到了预期的结果。请参阅代码中的示例。

更多Rubyish的例子是:

def odd_value_and_position(array)
    newArray=[] #create new array
    i=0 #i=0
    while i < array.length #loop while
        newArray.push(array[i]) if array[i] % 2 != 0
        i = i + 2
    end

    return newArray
end

puts odd_value_and_position([0,1,2,3,4,5]) #=> []
puts odd_value_and_position([1,2,3,4,5])   #=> [1,3,5]

答案 2 :(得分:1)

如果我理解正确的问题,我会选择以下内容:

def some_method_name(array)
  array.select.with_index { |*ij| 
    ij.all?(&:even?)
  }
end

puts some_method_name([0, 1, 2, 3, 4, 5, 10, 13, 21, 22, 30])

# >> 0
# >> 2
# >> 4
# >> 10
# >> 30

这是它正在做的事情:

def some_method_name(array)
  array.select.with_index { |*ij| 
    ij               # => [0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [10, 6], [13, 7], [21, 8], [22, 9], [30, 10]
    ij.all?(&:even?) # => true,   false,  true,   false,  true,   false,  true,    false,   false,   false,   true
  }
end

puts some_method_name([0, 1, 2, 3, 4, 5, 10, 13, 21, 22, 30])

# >> 0
# >> 2
# >> 4
# >> 10
# >> 30

原始代码存在一些问题。

使用while循环很容易导致逐个错误或永不触发的循环或永不结束的循环出现问题。

为了在Ruby中解决这个问题,我们使用eachmapselectreject或类似的迭代器来遍历数组,并依次处理每个元素,然后根据那个逻辑。

array.select正在查看每个元素并在块中应用逻辑,寻找&#34; truthy&#34;结果。 with_index将迭代索引添加为传递给块的第二个值。 *id将传入的两个值转换为数组,从而可以轻松应用all?及其even?测试。如果even?true返回all?,则true触发并再次返回select,并向{{1}}发出信号以返回该数组元素。