红宝石'is_a?需要类或模块(TypeError)

Posted

技术标签:

【中文标题】红宝石\'is_a?需要类或模块(TypeError)【英文标题】:Ruby 'is_a?' class or module required (TypeError)红宝石'is_a?需要类或模块(TypeError) 【发布时间】:2014-06-15 20:45:37 【问题描述】:

我正在使用 Ruby 并尝试创建一个小型银行帐户程序。当我运行这个使用 create_account 运行的特定代码行时:

unless @response.is_a? Integer && @response.to_str.length == 4
    puts "Your response must be 4 numbers in length."
    create_account
else
    @pin = @response
    puts "Your pin has been set."
end

我收到了这样的回复:

bank_account.rb:24:in 'is_a?':class or module required (TypeError)
    from bank_account.rb:24:in 'create_account'
    from bank_account.rb:47:in '<main>'

我无法完全弄清楚发生了什么,但我将我的其余代码包括在内。它不完整,显然是因为我被困在这部分。我经历了一个 while 循环并输入“创建帐户”以启动 create_account 方法。我的目标是运行条件并要求用户输入一个 4 位整数,就像任何 ole pin 号码一样。如果它不是整数也不是 4 位的长度,我调用 create_account 方法让它们重新开始。

如果需要该信息,我正在运行 ruby​​ 2.0.0,但我打赌这可能更多地与我的代码有关。 *** 对我来说是新的,所以如果有人问过这个问题,我很抱歉。在提出问题之前,我尝试按照建议做功课,但我仍然很难过。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

您需要将Integer 类放在括号中:

unless @response.is_a?(Integer) && @response.to_str.length == 4

您实际上是在 (Integer &amp;&amp; @response.to_str.length == 4) 上评估 is_a?,这是一个布尔值,而不是类或模块。

【讨论】:

如果我没有特别将类放在括号中,我没有意识到它包括了条件的整个后半部分。谢谢你。由于某种原因,我仍然无法让它接受长度为四个数字的东西,但一次一个问题。 @MarkHJr,如果@response 确实是Integer,那么你不能调用to_str,只能调用to_s。当我在控制台中尝试使用值为 454524 的测试时,我收到以下消息:NoMethodError: undefined method to_str' for 454524:Fixnum`。 很好的答案和解释!当它可能需要更长的时间时,它真正快速地解决了我的问题。 +1

以上是关于红宝石'is_a?需要类或模块(TypeError)的主要内容,如果未能解决你的问题,请参考以下文章

我试图在红宝石句子中隔离白色空间

导入类或模块

ruby 1.9.2 有 is_a 吗?功能?

在模块前面加上 ActiveSupport::Concern ?红宝石 2+

是否可以通过使用字符串作为模块来扩展类? - 红宝石 2.7.1

是否可以从带有 String 的模块执行方法? - 红宝石 2.7.1