我的代码有什么问题(试图缩写)?

时间:2011-10-01 14:56:43

标签: ruby irb

我使用的是irb / ruby​​1.9.1。

第一步

我写了下面的代码:

  def isUppercase  
    self>= ?A && self<= ?Z  
  end  

 class String  
    def abbreviate  
      abbr = ""  
      each_byte do |c|  
        if c.isUppercase  
          abbr += c.chr  
        end  
      end  
      abbr  
    end  
  end  

第二步

我正在评估下面我希望成为“UFO”的代码 "Unidentified Flying Object".abbreviate

然而,错误发生了。 我该如何纠正? 错误就在这里。

irb(main):044:0> load("abbrevi.rb")
=> true
irb(main):045:0> "Unidentified Flyng Object".abbreviate ArgumentError: comparison of Fixxnum with String failed
from C:/Ruby192/lib/ruby/1.9.1/abbrevi.rb:4:in >=' from 
C:/Ruby192/lib/ruby/1.9.1/abbrevi.rb:4:in isUppercase' from 
C:/Ruby192/lib/ruby/1.9.1/abbrevi.rb:12:in block in abbreviate' from 
C:/Ruby192/lib/ruby/1.9.1/abbrevi.rb:11:in each_byte' from 
C:/Ruby192/lib/ruby/1.9.1/abbrevi.rb:11:in abbreviate' from (irb):45 from 
C:/Ruby192/bin/irb:12:in <main>

2 个答案:

答案 0 :(得分:2)

试试这个:

class Fixnum
  def isUppercase
    self.chr >= ?A && self.chr <= ?Z
    #note use of `chr` to avoid error that occurs when
    #comparing a Fixnum to a String
  end
end

class String
  def abbreviate
    abbr = ""
    each_byte do |c|
      if c.isUppercase
        abbr += c.chr.to_s #note this usage as well
      end
    end
    abbr
  end
end

请注意,您无法将字符串添加到数字或进行比较,因此以下内容会产生错误:

irb> 1 >= "A"
# => ArgumentError: comparison of Fixnum with String failed

更新: @ coreyward的回答是更好的方式来做你正在做的事情,但我的答案只是指出如何修复你的代码和错误的原因。一种更好的方法可能是使用正则表达式。

答案 1 :(得分:2)

我不明白为什么你要检查字节是否为大写,而不是字符(有多字节字符),但这会让你回避完全问题:

class String
  def abbreviate
    each_char.reduce('') do |abbr, c|
      abbr += c if ('A'..'Z').include?(c)
      abbr
    end
  end
end

但是,这仍然不会考虑非A-Z字母/字符。