在循环中命名变量时,我会得到这个错误。该方法的要点是打印数组中唯一具有唯一奇偶的元素的索引位置。例如,方法应该为以下输入数组打印" 3“,因为它是唯一的奇数,其他的都是偶数: 2、4、6、3、8、10。更具体地说,它指出了下面的”奇数“和”偶数“变量的错误("main.rb:7:动态常量赋值奇数===%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发布于 2020-05-10 06:36:57
当您在Ruby中定义大写变量时,这是一个常量--它是一种特殊类型的变量,不允许更改值(从技术上讲,您可以使用const_set更改它,但这在这里并不重要)。
由于这个限制,Ruby不允许您在函数中更改常量。它假定函数将被多次调用,这将导致常量更改值,正如我刚才提到的,这是非法的。
因此,快速修复,只需将您的Odd和Even替换为小写版本odd和even。这样,它们是常规变量,而不是常量。
发布于 2020-05-10 18:26:07
使用内置数组方法可以轻松地返回上述代码:
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,它很好地重新做了计算,因为它就像你在调用一个方法一样。
注意,在方法中执行Odd = Proc.new{ |n| n%2 == 1 }仍然会给出相同的错误dynamic constant assignment Odd = Proc.new { |n| numbers[n] % ...,因为每次方法运行时都会重新执行代码,每次都给出不同的常量值。因此,通过将Odd = Proc.new{ |n| n%2 == 1 }定义置于方法之外,然后执行if Odd.call(i),它将工作得很好。
https://stackoverflow.com/questions/61707668
复制相似问题