动态常量赋值main.rb:6:Ruby

问题描述 投票:2回答:2

我在循环中命名变量时遇到该错误。该方法的重点是在数组中打印具有唯一奇偶校验的唯一元素的索引位置。例如,该方法应该为以下输入数组打印“ 3”,因为它是唯一的奇数,其他所有内容均为偶数:[2、4、6、3、8、10]。更具体地说,它指出了以下“ Odd”和“ Even”变量的错误(“ main.rb:7:动态常量赋值Odd =数字[i]%2 == 1”)。

  def test(numbers)
  i=1
  countOdd = 0
  countEven = 0
  Odd = numbers[i] % 2 == 1
  Even = numbers[i] % 2 == 0

  while i < numbers.length
    if Odd
      countOdd += 1
      else countEven +=1
      end
    i+=1
  end

  if countEven == 1
  print Odd.index
  else print Even.index
  end
end
ruby ruby-on-rails-4
2个回答
2
投票

当您在Ruby中定义一个大写变量时,它是constant-这是一种特殊类型的变量,不允许更改值(嗯,从技术上讲,您可以使用const_set进行更改,但这在这里并不重要)。

由于此限制,Ruby 不允许您可以从函数内部更改常量。它假定函数将被多次调用,这将导致常量更改值,正如我刚才提到的那样,这是非法的。

因此,快速修复,只需将您的OddEven替换为小写版本oddeven。这样,它们就是常规变量而不是常量。


0
投票

以上代码可以使用内置数组方法轻松返回:

even_numbers = numbers.select(&:even?)
odd_numbers = numbers.select(&:odd?)

然后,偶数将为even_numbers.count,类似地为odd_numbers.count

第一个奇数索引将为numbers.find_index(odd_numbers.first)

对于常量,您可以将proc分配给常量:Odd = Proc.new{ |n| n%2 == 1 }然后像这样调用常量:Odd.call(10) #=> false,类似地,您可以为偶数定义proc。

这里发生的是,每次传递给方法的数字每次都可能具有不同的值,这将导致该方法运行时每次常量都具有不同的值,但是常量的含义是保持一个不会更改。

还请注意您的方法中的以下条件:

if Odd
  then do something
....

实际上不是正确的。一旦常量拥有一个值,那么在执行期间它将具有该值。因此,在执行Odd = some_integer % 2 == 1之后,Odd常数将始终为true或false。并且不会在您的some_integer % 2 == 1条件下重新执行if。但是,如果将其设为proc或lamda,则可以很好地重新进行计算,因为就像您正在调用方法一样。

© www.soinside.com 2019 - 2024. All rights reserved.