【问题标题】:Ruby arrays - cannot access valueRuby 数组 - 无法访问值
【发布时间】:2010-10-18 20:42:07
【问题描述】:

所以我正在为我的班级做一个小而简单的项目,但由于某种原因,我无法使用变量访问值。

这是我的课:(我在使用 getAnswer 方法时遇到问题,尤其是 answerArray 数组)

#Create random fact array
class RandomFact
    def initialize()
        @randomNum = rand(5)
    end

    def getQuestion
        randomNum = @randomNum
        questionArray = Array.new
        questionArray[0] = "Do you liek mudkipz?"
        questionArray[1] = "Question2"
        questionArray[2] = "Three"
        questionArray[3] = "Reddit"
        questionArray[4] = "4chan"

        puts questionArray[randomNum]
        return randomNum
    end

    def getAnswer(randomNum,answer)
        answerArray = Array.new
        answerArray[0] = "one"
        answerArray[1] = "two"
        answerArray[2] = "three"
        answerArray[3] = "four"
        answerArray[4] = "five"

        return answerArray[randomNum]
    end

end

这是我的班级:

    randomNum = cgi['randomNum']
    answer = cgi['answer']
    puts newQuestion.getAnswer(randomNum,answer)

现在的问题是 randomNum 保存了以前形式的值。如果我在我从表单中提取值的位置打印出 randomNum,我会得到它。
如果我在 getAnswer 方法中打印出 randomNum,我会得到它。
如果我打印出 answerArray[0],我会得到一个值。
如果我打印出 answerArray[randomNum] 我什么也得不到。



它几乎是上面 getQuestion 方法的精确副本,并且可以正常工作。有什么意见吗?

【问题讨论】:

  • 做一个p randomNump answer 这样我们就可以看到有关randomNum 和答案的详细信息。仅供参考,p obj 相当于 puts obj.inspect - 它提供的信息比 puts obj.to_s 更多,并且通常对调试更有用。

标签: ruby arrays


【解决方案1】:

您的代码中有许多看起来很不规则的东西。

在两个单独的数组中描述问题和答案是很麻烦的,无论你如何分割它。更好的是在一个简单、一致的数组数组中定义它们,然后使用内置的 Array#rand 方法选择其中一个元素,该方法将随机选择其中一个。

例如


  class RandomFact
    QUESTIONS = [
      [ 'How many nuts can a squirrel eat?', '2' ],
      [ 'What is my favorite color?', 'blue' ]
    ]

    def self.rand
      QUESTIONS.rand
    end
  end

  (question, answer) = RandomFact.rand

  puts "Question: #{question}"
  puts "Answer: #{answer}"

【讨论】:

  • 您指的是哪个版本的 Ruby? Ruby 1.8.6、1.8.7 和 1.9.1 都没有 Array#rand。 Ruby 1.9.1 有 Array#sample,可以做你想做的事,但没有 Array#rand。
  • 这一定是 Rails 的核心扩展之一,我忘记了它是那个包的一部分。感谢您的澄清。
【解决方案2】:

你是在某个地方初始化 newQuestion 吗?在您给出的示例中,它将为零。

一些与问题无关的花絮:您不需要 return 语句。 Ruby 总是返回最后一个值。只需将值本身放在那里。在 Ruby 中,标准做法是将变量写为 new_question,而不是 newQuestion。

【讨论】:

  • 是的,我是在我的 Print-content 行之后立即启动它,它只是不在上面的示例中。我注意到我的老师这样写变量,有什么原因吗?
  • 什么打印内容行?你的意思是在看跌期权之后?如果是这样,那当然是行不通的。以这种方式编写变量是可行的,它只是违反了 Ruby 约定。如果您包含代码中缺失的部分,您将更有可能获得更好的答案。
  • answerArray[randomNum.to_i] 得到什么?
  • 好吧,做 answerArray[randomNum.to_i] 工作,但怎么分两步做没有? randomNum.to_i answerArray[randomNum.to_i]
  • 因为您没有将结果保存在任何地方。如果您执行 randomNum = randomNum.to_i ,它将被保留。当然,直接立即执行会更容易:randomNum = cgi['randomNum'].to_i
【解决方案3】:

我不确定您在这里真正想要做什么,但如果您真的只是想按照您的示例显示的那样做,那么您不需要创建类和函数。一组问题和答案会很有效。

QA = [
  ["What is the capital of Estonia?","Tallinn"],
  ["How many times to 6 go into 18?","3"],
  ["What have I got in my pocket?","The Ring"]
]

qnum = cgi["qnum"].to_i
question = QA[qnum].first
answer = QA[qnum].last

【讨论】:

  • 这是我要上 Ruby 的一门课,所以我们需要花很长的时间来学习这门语言。但是,是的,这将是一种理想的方式。
【解决方案4】:

它必须是您的输入。当我在 irb 中尝试时,它对我有用。

>> new_q = RandomFact.new
=> #<RandomFact:0x41028e74 @randomNum=2>
>> new_q.getQuestion
Three
=> 2
>> new_q.getAnswer(2, "")
=> "three"

【讨论】:

  • 我知道这是我的输入,我只是不知道它有什么问题。我试图转换输入以确保它是一个 int 并且它仍然不起作用。输入在那里,我可以打印出来我只是因为某种原因不能将它与数组一起使用。
【解决方案5】:

随机数可能是来自 CGI 的字符串。使用 randomNum.to_i 将其转换为整数,您将被设置。

【讨论】:

  • 不,我之前曾尝试使用 int() 对其进行更改。我刚试过 to_i 也没用。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2017-04-13
  • 2015-09-14
  • 2016-07-03
相关资源
最近更新 更多