当我的对象不是时,为什么gsub抱怨nil?

时间:2016-10-13 19:36:36

标签: ruby-on-rails ruby null gsub

我正在使用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控制台中重现这一点,所以我想知道这是其他的事情,或者是否有更好的方法来编写上述内容。

1 个答案:

答案 0 :(得分:0)

一些想法:

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