Refactoring Ruby code

Gepubliceerd op: 10.XII.2005 03:07 CET
Categorieën: java, ruby

Als Java professional ben ik verknocht aan de refactoring mogelijkheden van Eclipse. Sterker nog de reden waarom ik van Vim en commandline CVS overgestapt ben, is refactoring. M’n grootste zorg bij de stap naar Ruby is het missen van dergelijk tools. Ik heb ze nog niet gemist maar dat is ook niet zo gek als je pas een half jaar over Ruby obsedeerd en nog geen honderden kilobytes code hebt die eigenlijk anders moeten.

Gelukkig ben ik niet de enige die zich daar zorgen over maakt en zijn er veel slimmere mensen die allang oplossingen hebben gevonden. Via een blog bericht van Curt Hibbs kwam ik op een uitgebreid verhaal van ene Murphee en daar vandaan op een waanzinnig Ruby-eske oplossing van Mike Williams. M’n hartje sprong!

Lees verder →

nog meer roman numerals

Gepubliceerd op: 17.XI.2005 04:29 CET
Categorieën: ruby
Reacties: 2 stuks

Oh, we willen natuurlijk ook de andere kant op kunnen! Voeg het volgende toe aan de uitgebreide Fixnum:

class Fixnum

  @@ROMAN_HASH = Hash[*@@ROMAN_DIGITS.map{|a,b|[b,a]}.flatten]

  def self.from_roman(txt)
    result, last = 0, 0
    txt.upcase.reverse.each_byte do |c|
      n = @@ROMAN_HASH[c.chr] or raise "'#{c.chr}' is not a valid roman digit"
      result += n < last ? -n : n
      last = n
    end
    result
  end
end

En nu kan je met Fixnum.from_roman('MCMLXXII') weer terug naar 1972!

roman numerals

Gepubliceerd op: 9.XI.2005 07:13 CET
Categorieën: ruby
class Fixnum
  @@ROMAN_DIGITS = [
      [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
      [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
      [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'],
      [1, 'I']
  ]

  def to_roman
    raise "#{self} out of range (1 - 3999)" if self <= 0 || self >= 4000

    result, rest = '', self
    @@ROMAN_DIGITS.each { |n,t| result << t and rest -= n while rest >= n }
    result
  end
end

En nu kan je 1972.to_roman gebruiken in je code! Yay! Ik hou van ruby en ruby houdt van mij!