Что не так в моем коде (пытаюсь сократить)?

#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.