首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态常量赋值main.rb:6: Ruby

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

Stack Overflow用户
提问于 2020-05-10 05:39:17
回答 2查看 847关注 0票数 2

在循环中命名变量时,我会得到这个错误。该方法的要点是打印数组中唯一具有唯一奇偶的元素的索引位置。例如,方法应该为以下输入数组打印" 3“,因为它是唯一的奇数,其他的都是偶数: 2、4、6、3、8、10。更具体地说,它指出了下面的”奇数“和”偶数“变量的错误("main.rb:7:动态常量赋值奇数===%2 == 1")。

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 06:36:57

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

由于这个限制,Ruby不允许您在函数中更改常量。它假定函数将被多次调用,这将导致常量更改值,正如我刚才提到的,这是非法的。

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

票数 3
EN

Stack Overflow用户

发布于 2020-05-10 18:26:07

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

代码语言:javascript
复制
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。

这里发生的是,每当方法被调用时,常数都会被重新定义,从而有一个新的值,但是常量意味着保存一个不会改变的值,这就是错误的原因。

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

代码语言:javascript
复制
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),它将工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61707668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档