【问题标题】:Why is gsub complaining about nil when my object isn't nil?当我的对象不是 nil 时,为什么 gsub 会抱怨 nil?
【发布时间】:2016-10-13 19:36:35
【问题描述】:

我正在使用 Rails 4.2.7,并且有以下内容可以修剪特定表达式中的所有空白……

  puts "division: #{division}$$"
  division = division.gsub(/\A\p{Space}+|\p{Space}+\z/, '')

当我运行它时,最终我的程序会因为这个输出而死掉……

division: 18-29$$
Error during processing: undefined method `gsub' for nil:NilClass
/Users/mikeb/Documents/workspace/runtrax/app/models/race_time.rb:27:in `block in <class:RaceTime>'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:448:in `instance_exec'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:448:in `block in make_lambda'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:228:in `block in halting_and_conditional'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:506:in `block in call'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:506:in `each'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:506:in `call'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
…

我不明白为什么 gsub 认为它在上面的行中得到 nil 时,字符串显然不是空的(打印出 18-29 的值)。奇怪的是,我无法在 Rails 控制台中重现这一点,所以我想知道这是发生了什么其他事情,或者是否有更好的方法来编写上述内容。

【问题讨论】:

  • 如果division #=&gt; "18-29",我无法重现错误。
  • binding.prybyebug 而不是 puts 并检查值。
  • 这是真正的代码还是你在这两行之间遗漏了什么?
  • 我认为这不是您的代码,您使用回调的方式有些问题

标签: ruby-on-rails ruby null gsub


【解决方案1】:

一些想法:

  1. gsub 是一种字符串方法。用这个来测试“division”的类型:puts division.class 你可能会发现虽然“division”不是“nil”,但它可能不是一个字符串,所以它会抛出一个错误。有关更多说明,请参阅HERE
  2. 由于您的代码旨在更改除法的值,因此您可以使用“破坏性方法”更优雅、更经济地完成此操作,如下所示:division.gsub!(/\A\p{Space}+|\p{Space}+\z/, '') 有关破坏性方法的讨论,请参见 HERE(注意“! ”,也称为“砰”)。这可能不能解决最初的问题,但它确实使您的代码变得漂亮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2020-01-14
    • 2011-12-23
    相关资源
    最近更新 更多