我使用的是Rails 4.2.7,并使用以下代码从特定表达式中删除所有空白…
puts "division: #{division}$$"
division = division.gsub(/Ap{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控制台中复制此内容,因此我想知道这里是否发生了其他事情,或者是否有更好的方法来编写上述内容。
一些想法:
- gsub是一个字符串方法。用这个测试"division"的类型:
puts division.class
你可能会发现,虽然"division"不是"nil",但它可能不是一个字符串,所以它会抛出一个错误。更多描述见这里。 - 既然你的代码是为了改变除法的值,你可以更优雅、更经济地使用"破坏性方法",如下所示:
division.gsub!(/Ap{Space}+|p{Space}+z/, '')
见这里破坏性方法的讨论(注意"!",也称为"bang")。这可能无法解决最初的问题,但它确实使您的代码更加美观。