Ruby 是否可以将所有变量和方法放在一个类中?

Ruby 是否可以将所有变量和方法放在一个类中?,ruby,class,Ruby,Class,对不起,这是个初学者的问题。我按照快速教程做了一个Ruby小测验,我将对此进行解释 我创建了一个类,如下所示: class Question attr_accessor :prompt, :answer def initialize(prompt, answer) @prompt = prompt @answer = answer end end 然后我创建了一个变量作为问题: p1 = "What color is an apple?

对不起,这是个初学者的问题。我按照快速教程做了一个Ruby小测验,我将对此进行解释

我创建了一个类,如下所示:

class Question
    attr_accessor :prompt, :answer

    def initialize(prompt, answer)
        @prompt = prompt
        @answer = answer
    end
end
然后我创建了一个变量作为问题:

p1 = "What color is an apple?\n(a)red\n(b)orange\n(c)yellow"
然后创建一个数组来存储问题并分配答案:

questions = Question.new(p1, "a")
下面是一种方法:

def run_test(questions)
    answer = ""
    score = 0
    for question in questions
        puts question.prompt
        answer = gets.chomp()
        if answer == question.answer
            score += 1
        end
    end
    puts ("You got " + score.to_s + "/" + questions.length().to_s)
end
现在,我想模块化一点,使问题类包含变量/问题、数组/答案和方法,以便我可以从另一个文件(如主应用程序文件)引用它。是否可以将所有这些元素放入类中,以便我可以从另一个文件(主应用程序)引用它


有更好的方法吗?我尝试不让类中的所有内容都包含在内,但无法从另一个文件访问不同的元素。

欢迎来到Stack Overflow和Ruby社区

有更好的方法吗

当涉及到编程时,总是有其他的方法做事情,有时被认为更好,有时更糟,这取决于具体情况。最好了解什么是最佳实践并加以实践,直到它成为您默认的编码方式。生活中的许多事情都以最佳实践作为指导,而不是规则

在你的情况下,一切都很好,直到你想导入代码在另一个项目中重用它,所以你选择的抽象不再工作,这种情况发生了,很好,是时候重构它了

现在看看您的代码,问题类只是一个美化的数据结构,您可以实现类似于哈希
{prompt:'',answer:'}
的功能,这意味着您的类有数据部分,但没有逻辑部分,我的第一个建议是将答案检查逻辑移动到问题类中的方法

课堂提问
属性读取器:提示,:正确答案
def初始化(提示,正确回答)
@提示=提示
@正确答案=正确答案
结束
def分数(答案)
如果答案==@correct\u answer,则返回1
返回0
结束
结束
这种方法的好处是,最终你可能会决定做一些事情,比如“这个问题值2分”,“当用户输入
(几个空格)c(几个空格)
时,我想把它当作
c
”,这就是实现这种逻辑的地方

下一个你可以考虑做的是引入一个新的班级,一个代表一个测试/测验/考试的班级。该类负责执行在
run\u test
中实现的逻辑。这样,您应该能够导入和重用代码。写下这堂课时,想想你可以通过考试做些什么,你可以“开始”、“结束”、“回答问题”、“转到下一个问题”等等

在编程中,避免IO与代码耦合是很常见的,在这种情况下,IO是由
提出问题。提示符
answer=gets.chomp()

可以预期以下API会起作用,但这实际上取决于您的偏好和您试图实现的目标:

def运行测试(测验)
测验。问题。每个做的问题|
提出问题
answer=get.chomp()
问答(问题,答案)
结束
puts(“你得到了#{quick.score}/#{quick.maximum_score}”)
结束
您可以看到,使用这种方法,代码的主要焦点是循环问题和验证IO,如果您正在构建一个网页,您仍然可以使用问答类,那么将改变的是提示问题的方式和获得答案的方式。你对你的学生隐瞒的是你如何在考试中得分,最高分是多少,当前的分数是多少

起草本规范时,我想到的其他事情: -我应该有一个将分数重置为0的
start
方法吗? -如果我将问题隐藏在
next_question
方法之后,这样我就可以返回
nil
,如果没有问题了,按照目前的方法,可以通过多次运行
run_test
并获得所有附加分数“You got 23/10”来多次回答测验

我希望这能给你下一步可以做什么的想法