我使用的是irb / ruby1.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>
答案 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字母/字符。