#ruby #irb
#ruby #irb
Вопрос:
Я использую irb / ruby1.9.1.
1-й шаг
Я написал код ниже:
def isUppercase
self>= ?A amp;amp; self<= ?Z
end
class String
def abbreviate
abbr = ""
each_byte do |c|
if c.isUppercase
abbr = c.chr
end
end
abbr
end
end
2-й шаг
Я оцениваю код, приведенный ниже, который, как я ожидал, будет «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>
Комментарии:
1. Обычно в сообщении об ошибке сообщается, как исправить ошибку. Поскольку вы не предоставили сообщение об ошибке, вам нечего сказать.
2. @KotaroEzawa: не ставьте подобные вещи в комментариях. Отредактируйте свой вопрос, чтобы добавить детали (на этот раз я только что сделал это для вас). И, пожалуйста, используйте
{}
кнопку для форматирования кода.
Ответ №1:
Попробуйте это:
class Fixnum
def isUppercase
self.chr >= ?A amp;amp; 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 — лучший способ сделать то, что вы делаете в целом, но мой ответ только указывает, как исправить ваш код и причину вашей ошибки. Еще лучшим способом может быть использование регулярных выражений.
Ответ №2:
Я не понимаю, почему вы проверяете, является ли байт прописным, а не символом (есть многобайтовые символы), но это полностью устраняет вашу проблему:
class String
def abbreviate
each_char.reduce('') do |abbr, c|
abbr = c if ('A'..'Z').include?(c)
abbr
end
end
end
Тем не менее, это по-прежнему не учитывает буквы / символы, отличные от Az.